2013-02-12 18 views
8

Die setView() Methode der AlertDialog Klasse ermöglicht es, eine benutzerdefinierte Ansicht für das Dialogfeld anzugeben. Gibt es Einschränkungen hinsichtlich der Steuerelemente, die in dieser benutzerdefinierten Ansicht enthalten sein können?android AlertDialog setView Regeln

Auch, wenn wir eine benutzerdefinierte Ansicht einstellen, können wir noch Schaltflächen mit setPositiveButton(), setNegativeButton(), etc. hinzufügen?

Antwort

28

Die Methode setView() der AlertDialog-Klasse ermöglicht die Angabe einer benutzerdefinierten Ansicht für das Dialogfeld. Gibt es Einschränkungen hinsichtlich der Steuerelemente, die in dieser benutzerdefinierten Ansicht enthalten sein können?

Die setView() Methode in AlertDialog.Builder nimmt jede Klasse von View erweitert (siehe es Unterklassen und deren Unterklassen).

Das bedeutet EditTexte, Buttons usw. Aber auch Layouts, die von viewGroups ausgehen.

Auch, wenn wir eine benutzerdefinierte Ansicht einstellen, können wir noch Schaltflächen mit setPositiveButton, setNegativeButton usw. hinzufügen?

Ja, es betrifft nur den Körper. Schaltflächen werden unterhalb des Layouts hinzugefügt.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    // Get the layout inflater 
    LayoutInflater inflater = getLayoutInflater(); 
    // Inflate and set the layout for the dialog 
    // Pass null as the parent view because its going in the dialog 
    // layout 
    builder.setView(inflater.inflate(R.layout.YourLayout, null)) 
     .setPositiveButton(AlertDialog.BUTTON_NEGATIVE, "Yes!", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        // 
       } 
     }) 
     .setNegativeButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        LoginDialogFragment.this.getDialog().cancel(); 
       } 
     }); 
    return builder.create(); 
} 

UPDATE:

Diese Antwort scheint vor ein paar neue Aktivität seit 2 Jahren zu erhalten und einige Dinge haben sich geändert.

Ich aktualisierte den Code ein wenig, um die Formatierung zu verbessern, und fügte den folgenden Tipp aufgrund des aktuellen Stands der Best Practices hinzu.

Der AlertDialog definiert den Stil und die Struktur für Ihren Dialog, aber Sie sollten ein DialogFragment als Container für Ihren Dialog verwenden. Die DialogFragment-Klasse stellt alle Steuerelemente bereit, die Sie zum Erstellen Ihres Dialogfelds und zum Verwalten seiner Darstellung benötigen, anstatt Methoden für das Dialog-Objekt aufzurufen.

Das obige Beispiel ist gemeint, wenn Sie DialogFragment erweitern und einen AlertDialog in der onCreateDialog() - Callback-Methode erstellen.

+0

Ich versuche, deine Antwort hier zu folgen. Wenn ich jedoch die Zeile 'LayoutInflater inflater = getLayoutInFlater() 'betrete, bekomme ich immer eine Fehlermeldung, dass der Methodenaufruf einen ** Bundle ** -Parameter erfordert. Ich habe versucht, den savedInstanceState von den onCreateDialog-Parametern zu verwenden, aber das verursachte neue Fehler. – Brian

+0

Sie befinden sich wahrscheinlich in einem Fragment und benötigen 'getActivity(). GetLayoutInflater()' oder 'LayoutInflater.from (getActivity())' – Timmetje

2

Soweit ich weiß, können Sie in setView() alles hinzufügen, was Sie wünschen. Die positiven/negativen Tasten sind nicht betroffen.

3

In der mitgelieferten Dokumentation für AlertDialog gibt es keine Einschränkungen, was Sie in der Ansicht eines AlertDialogs einstellen könnten.

So wird die benutzerdefinierte Ansicht ihren Platz unter dem Titel des Dialogfelds und über den Schaltflächen einnehmen, die überhaupt nicht betroffen sein werden.

0

VERSUCH, DAS BEISPIEL

android.support.v7.app.AlertDialog.Builder adb = 
    new android.support.v7.app.AlertDialog.Builder(YoreActivity.this); 

    ViewGroup subView = (ViewGroup) getLayoutInflater().// inflater view 
         inflate(R.layout.yore_layout_alert, null, false); 

    try {// set data of yore layout 

    ((TextView) subView.findViewById(R.id.messageAlert))//get element TextView 
              .setText(SomeText);//set text 

    } catch (NullPointerException npe) { 
    npe.printStackTrace(); 
    } 

    adb.setPositiveButton("textPOSITIVE", new DialogInterface.OnClickListener() {//one method go 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     // TODO some code 
    } 
    });//one method end 

    final android.support.v7.app.AlertDialog alertDialog = 
     adb.setTitle(SomeText)// set ttile 
     .setView(subView).create();// add view in AlertDialog.Builder, and create AlertDialog 

    try { //two method go 

    ((Button) subView.findViewById(R.id.customPositivButton)) 
    .setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // TODO some code 
     alertDialog.dismiss(); 
     } 
    }); 

    } catch (NullPointerException npe) { 
    npe.printStackTrace(); 
    } //two method end 

    alertDialog.show(); //show in YoreActivity