2012-07-01 11 views
21

W poniższym kodzie poniżej, jak mogę zamknąć okno alertu? Nie chcę powodować przecieku pamięci. Próbowałem .dismiss() na alertDialog, ale to nie działa ... DziękiJak odrzucić AlertDialog.Builder?

// User pressed the stop button 
public void StopMsg_button_action(View view){ 
    final EditText password_input = new EditText(this); // create an text input field 
    password_input.setHint("Enter Password"); // put a hint in it 
    password_input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); // change it to password type 

    AlertDialog.Builder alertDialog = new Builder(this); // create an alert box 
    alertDialog.setTitle("Enter Password"); // set the title 
    alertDialog.setView(password_input); // insert the password text field in the alert box 
    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { // define the 'OK' button 
     public void onClick(DialogInterface dialog, int which) { 
      String entered_password = password_input.getText().toString(); 
      if (entered_password.equals(my_password)) { 
       locManager.removeUpdates(locListener); // stop listening for GPS coordinates 
       startActivity(new Intent(Emergency_1Activity.this,Main_MenuActivity.class)); // go to main menu 
      } else { 
       alert("Incorrect Password"); 
      } 
     } 
    }); 
    alertDialog.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { // define the 'Cancel' button 
     public void onClick(DialogInterface dialog, int which) { 

     } 
    }); 
    alertDialog.show(); // show the alert box 
} 

Odpowiedz

39

Co nie udało się odwołać()?

Powinieneś być w stanie wykorzystać zarówno Dialog.dismiss() lub Dialog.cancel()

alertDialog.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { // define the 'Cancel' button 
    public void onClick(DialogInterface dialog, int which) { 
     //Either of the following two lines should work. 
     dialog.cancel(); 
     //dialog.dismiss(); 
    } 
}); 
+0

możesz pokazać mi w kodzie? Jestem naprawdę zdezorientowany, dzięki – sneaky

+0

, zobacz moją edycję. – FoamyGuy

+13

'AlertDialog.Builder' nie ma metody" cancel " – xmen

1

Zamiast alertDialog.setNeutralButton wystarczy użyć alertDialog.setNegativeButton. Użyj dialog.cancel(), ponieważnie jest dostępna dla okien dialogowych Alert.

1

Wystarczy nadpisać metodę create i zapisać instancję okna dialogowego. Następnie można wywołać oddalenie

@Override 
public AlertDialog create() { 
    this.dialog = super.create(); 
    return this.dialog; 
} 

Gdzieś w kodzie:

dialog.dismiss(); 
10

należy użyć w ten sposób, jeśli nie chcesz umieścić żadnych przycisków i mają niestandardowy układ, w którym powiedz "Widok tekstowy" i po kliknięciu tego widoku tekstowego chcesz zamknąć okno alertu:

AlertDialog alertDialog = builder.show(); 

następnie sprawdź

if(alertDialog != null && alertDialog.isShowing()){ 
     alertDialog.dismiss(); 
} 

Jest to również prawdą, jeśli chcesz usunąć go gdzie indziej w swojej działalności po sprawdzeniu niektórych warunków.

+1

doskonała i najlepsza odpowiedź z doskonałym wyjaśnieniem –

28

Za pomocą poniższego kodu można wyświetlić ListBox AlertDialog, a po naciśnięciu elementu można zamknąć okno dialogowe. Kolejność kodu jest importan.

AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

String names[] ={"A","B","C","D"}; 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext,android.R.layout.simple_list_item_1,names); 

LayoutInflater inflater = getLayoutInflater(); 
View convertView = (View)inflater.inflate(R.layout.list_layout, null); 
ListView lv = (ListView) convertView.findViewById(R.id.listView1); 
lv.setAdapter(adapter); 
alertDialog.setView(convertView); 
alertDialog.setTitle("List"); 
final AlertDialog ad = alertDialog.show(); 

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     //Toast.makeText(mContext, position, Toast.LENGTH_LONG).show(); 
     ad.dismiss(); 
    } 
}); 
+0

Perfect! Wielkie dzięki! – NightFury

+0

Tego właśnie szukałem. Dzięki!!!! – Vicky

+0

Dziękujemy! Kluczem tutaj jest odrzucić okno dialogowe utworzone za pomocą alertDialog.show(). Tworzenie okna dialogowego z poziomu konstruktora i wywoływanie odwołania w tym oknie dialogowym nie powoduje odrzucenia tego samego okna dialogowego, które tworzymy, gdy wywołujemy funkcję show(). Ten miał mnie zakłopotany na trochę =) –

7

Metoda ta demos kodu, który jest potrzebny .. od wcześniejszej odpowiedzi Namrata za

@SuppressLint("InflateParams") 
private static void showDialog(Activity activity, int layoutId) 
{ 
    LayoutInflater inflater = activity.getLayoutInflater(); 
    View dialoglayout = inflater.inflate(layoutId, null); 

    AlertDialog.Builder builder = new AlertDialog.Builder(activity); 
    builder.setView(dialoglayout); 

    CustomDialog.doCustomLogic(activity, layoutId, dialoglayout); 

    final AlertDialog alertDialog = builder.show(); 

    // caller assumes there will be a btn_close element present 
    Button closeNowBtn = (Button) dialoglayout.findViewById(R.id.btn_close); 
    closeNowBtn.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      alertDialog.dismiss(); 
     } 
    }); 
} 
13

Kod jest bardzo prosty:

final AlertDialog show = alertDialog.show(); 

wreszcie w działaniu przycisku na przykład:

show.dismiss(); 

Na przykład le z niestandardowym alertdialog:

enter image description here

Kod na Java, można utworzyć obiekt AlertDialog:

public class ViewAlertRating { 

    Context context; 
    public ViewAlertRating(Context context) { 
     this.context = context; 
    } 

    public void showAlert(){ 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     View alertView = inflater.inflate(R.layout.layout_test, null); 
     alertDialog.setView(alertView); 

     final AlertDialog show = alertDialog.show(); 

     Button alertButton = (Button) alertView.findViewById(R.id.btn_test); 
     alertButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       show.dismiss(); 
      } 
     }); 
    } 
} 

kod XML layout_test.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 


    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Valoración" 
     android:id="@+id/text_test1" 
     android:textSize="20sp" 
     android:textColor="#ffffffff" 
     android:layout_centerHorizontal="true" 
     android:gravity="center_horizontal" 
     android:textStyle="bold" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:background="#ff37dabb" 
     android:paddingLeft="20dp" 
     android:paddingRight="20dp" /> 


    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="20dp" 
     android:paddingRight="20dp" 
     android:layout_marginTop="15dp"> 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="120dp" 
      android:id="@+id/edit_test" 
      android:hint="Descripción" 
      android:textColor="#aa000000" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:textColorHint="#aa72777a" 
      android:gravity="top" /> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center_horizontal" 
     android:paddingTop="10dp" 
     android:paddingLeft="15dp" 
     android:paddingRight="15dp" 
     android:paddingBottom="15dp" > 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <LinearLayout 
       android:orientation="horizontal" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:weightSum="1.00" 
       android:gravity="right" > 

       <Button 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="Enviar" 
        android:id="@+id/btn_test" 
        android:gravity="center_vertical|center_horizontal" 
        android:textColor="#ffffffff" 
        android:background="@drawable/btn_flat_blue_selector" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

wreszcie wezwać Aktywny:

ViewAlertRating alertRating = new ViewAlertRating(this); 
alertRating.showAlert(); 
+1

świetne rozwiązanie. Bardzo mi pomogło! –

0

Próbowałem tego i działa!

.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       alertDialog.setCancelable(true); 
      } 
     }); 
+0

Dziękuję ............. – Varma

0

Aby zamknąć lub anulować AlertDialog.Builder

dialog.setNegativeButton("إلغاء", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialogInterface, int i) { 
     dialogInterface.dismiss() 
    } 
}); 

Trzeba zadzwonić dismiss() na interfejsie dialogowego.

Powiązane problemy