[ERLEDIGT] Selbstdesignten Alertdialog schließen

J

JoEntwickler

Fortgeschrittenes Mitglied
5
Hallo,
ich habe einen AlertDialog, den ich selber designt hab. Also ein eigenes Layoutfile das als Popup geöffnet wird.

final LayoutInflater dialoginflater = getLayoutInflater();
final View dialogview = dialoginflater.inflate(R.layout.layoutFileDesPopups, null);
final AlertDialog.Builder dialogbuilder;
dialogbuilder = new AlertDialog.Builder(meineActivity.this);
dialogbuilder.setView(dialogview);
dialogbuilder.create().show();

Dann habe ich in dem Popuplayout einen Button mit einer vergebenen id.
Den OnClickListener setze ich dann so.

Button button = (Button)dialogview.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {

}
});

Der AlertDialog soll jetzt beim klick auf den Button geschlossen werden.
Wie geht das? Es gibt für den AlertDialog.Builder ein paar Methoden wie Close oder Cancel aber die funktionieren nicht.
Ich hoffe ihr könnt mir folgen was das Problem ist und wisst eine Lösung.
Ich habe dieses Video als Muster dafür verwendet:

Liebe Grüße
JoEntwickler
 
Hallo Jo,

das was du vorhast, ist eigentlich nicht Aufgabe eines AlertDialogs und es muss daher ein wenig umständlich
realisiert werden
AlertDialog.Builder | Android Developers

Du hättest Dir am besten einen Dialog mit Layout genommen und dismiss() verwendet.
Wäre weit einfacher gewesen :)
 
Hi,

du kannst den Button als positiveButton am DialogBuilder direkt einbinden. Dieser bekommt einen Dialog übergeben und an diesem Dialog kannst du dann die .cancel() Methode nutzen. Somit hast du den Button und die Funktionen, die er ausführen soll schon beim builden des AlertDialogs drin.

Etwa so:
Code:
deinAlertDialogBuilder.setPositiveButton("Ok",
                                new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int which) {
                                        dialog.cancel();
                                    }
                                });

Hoffe, das hilft dir weiter :)
 
@lordzwieback

Auch ne schöne workaround variante :)
 
So hatte ich das mal in einem früheren kleinen Projekt, sollte eigentlich auch hinhauen. :D
 
Hi,
den Ansatz von Lordzwieback finde ich sehr gut.
Ich müsste nurnoch irgendwie die id von dem Button übergeben.
Also irgendwo muss ich doch sagen welcher Button vom Layout der Positive Button ist oder?
 
Du kannst den Button von deinem vorbereiteten DialogLayout weglöschen. Sobald du den positive (oder negativeButton) in deinem Builder hinzufügst, werden diese automatisch an dein Layout unterhalb angehangen.

Du addest dein View separat (das hast du ja schon) und den Button hinterher auch. Die Syntax dafür hab ich dir oben schon geliefert.
 
Zuletzt bearbeitet:
.....
 
Zuletzt bearbeitet:
Also ich hab jetzt den Ja Button im Layout rausgelöscht und es so gemacht wie du.
Wenn ich es ausführ ist einfach nur der Ja Button weg.

Hier hab ich mal meine komplette Methode. Es soll ne Ja Nein Abfrage werden.
Das Neinereigniss kommt natürlich noch, es geht momentan nur darum das der Alert sich schließt.

private void askForExport(final String currency) {
final LayoutInflater dialoginflater = getLayoutInflater();
final View dialogview = dialoginflater.inflate(R.layout.yesnoquestion, null);
final AlertDialog.Builder dialogbuilder;
dialogbuilder = new AlertDialog.Builder(Cashflow_Anzeige.this);
dialogbuilder.setView(dialogview);
dialogbuilder.create().show();
TextView tvQuestion = (TextView) dialogview.findViewById(R.id.tvQuestion);
tvQuestion.setText(R.string.createQuestion);

dialogbuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

@override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});


}
 
Dein Fehler ist, dass du .show() aufrufst und hinterher erst den Button hinzufügst. Um das zu verhindern, kannst du deine Methode folgendermaßen umbauen:

Code:
private Dialog askForExport(final String currency) {
    final LayoutInflater dialoginflater = getLayoutInflater();
    final View dialogview = dialoginflater.inflate(R.layout.yesnoquestion, null);
    TextView tvQuestion = (TextView) dialogview.findViewById(R.id.tvQuestion);
    tvQuestion.setText(R.string.createQuestion);
   
    return new AlertDialog.Builder(Cashflow_Anzeige.this)
                .setView(dialogview)
                .setPositiveButton("Text1", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                })
                .setNegativeButton("Text2", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // ANDERE FUNKTIONEN....
                    }
                })
                .create();
}
Beim Aufruf der Methode wird quasi nichts anders gemacht als vorher, außer dass du dir den Dialog in der Methode erstellst und ihn, nachdem er kreiert wurde (.create()) zurückgibst.

Aufrufen kannst du das dann etwa so:
Code:
AlertDialog dialog = askForExport(parameter);
dialog.show();

Somit wird der Dialog immer erst dann angezeigt, wenn er in der Methode vollständig zusammengesetzt wurde. Der NegativeButton ist natürlich optional, falls du nur einen Button benötigst.
 
Jetzt funktioniert es danke.
Es sieht aber vom Aussehen her nicht so toll aus.
Der Hintergrund bei den Buttons ist weiß und die Buttons sind vertauscht.
Gibts da noch ne Möglichkeit, da noch was zu machen?
 
Gibts da noch ne Möglichkeit, da noch was zu machen?

Ich kann mich nur wiederholen , aber meinen Vorschlag hast du ja ignoriert :)
Für dein Vorhaben - gerade bei Customized - solltest du einen Dialog nehmen

AlertDialog ist von Dialog abgeleitet/vererbt und besitzt schon ein Layout/Mimik dahinter.
Warum diese unnötig "verbiegen" ?


java.lang.Object
android.app.Dialog
↳ android.app.AlertDialog


Beispiel :

device-2017-06-08-131900.png
 
Zuletzt bearbeitet:
Tut mir leid. Das war nicht beabsichtigt. Ich dachte wenn ich schon einen fertigen Ansatz habe dann mache ich das so.

Kann man auch bei einem AlertDialog ein eigenes Layout verwenden?
Ich möchte einfach den Dialog selber gestalten.
 
Kann man auch bei einem AlertDialog ein eigenes Layout verwenden?

Wie schon geschrieben : Nur bedingt und ist mit Aufwand verbunden und macht nicht wirklich glücklich.

Ein Dialog ist wie eine Activity mit Layout anzusehen , da kannst du wurschteln so viel du willst
 
Ok ich verstehe.
Ich beharre so darauf, weil ich nicht nur Ja und Nein abfragen habe, sondern auch Popups mir Infotext drin die ich mit einem X Button schließen möchte.
 
Was hindert dich daran einfach einen Ja/Nein Knopf in das Layout zu ziehen ?
(max 5 Sek arbeit)
 
Das ist ja nicht das Problem.
Sorry wenn du das falsch verstanden hast.
Es geht mir darum das wenn man auf einen Button clickt sich das Layout mit dem Alert wieder schließt.
Die normalen Aktionen was zu tun sind bei Ja oder Nein funktionieren.
Kannst du mir folgen?
 
nein ich habe dich nicht falsch verstanden , eher du mich :)

Du kannst in einen Dialog alles das reinpacken , was du möchtest JA/NEIN/Pizza bestellen etc etc.
Und wenn du mit einem Klick auf ein Element das Ding schliessen möchtest, dann rufst du dann ein dismiss() auf.

Und wenn du ein eigenes Layout verwenden möchtest ( deine EIngangsfrage) dann bleibt dir nichts anders übrig ,
als ein Dialog zu nehmen

Ich denke , das habe ich aber jetzt schon mehrmals geschrieben - irgendwie scheinst du dich dagegen zu wehren :)
In der Zeit wärst du schon dreimal fertig gewesen :)
 
Ich weiß und ich bin dir auch echt sehr sehr Dankbar für deine Geduld.
Ich möchte einfach einen Dialog selbst gestalten.
Auf welches Objekt muss man denn das dismiss() aufrufen, der Dialoge.Builder hat die Methode irgendwie nicht.
 
warte , ich tippe dir mal hier ein beispiel ( Nervensäge :) ^^ )
[doublepost=1503496355,1503496015][/doublepost]Erst mal das Grundgerüst

Code:
    //////////////////////////////////////////////////////////////////////////////////
    public class _dialog_OK extends Dialog
    {
        public Activity c;
        public Dialog  d;
        /////////////////////////////////////////////////////////////////////////////////////////////////////
        public _dialog_OK(Activity a)
        {
            super(a);
            this.c = a;
        }
        /////////////////////////////////////////////////////////////////////////////////////////////////////
        @Override public void onStart()
        {
            //  das  hier  muss  nicht sein , ist aber  recht nett :-)
            DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
            mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int height = (int) (metrics.heightPixels*0.5); //set height to x% of total
            int width = (int) (metrics.widthPixels*0.8); //set width to x% of total
            getWindow().setLayout(width,height);
            getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        }
        /////////////////////////////////////////////////////////////////////////////////////////////////////
        @Override
        public void onBackPressed()
        {
            super.onBackPressed();
        }

        /////////////////////////////////////////////////////////////////////////////////////////////////////
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.dein layout);

            Button btn = (Button) findViewById(R.id.btn_ok);
            btn.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                 dismiss ();
                }
            });
        }
    }

Aufruf aus deiner ACtivity

Code:
 _dialog_OK cdd = new _dialog_OK(this);
                    cdd.setCancelable(false);
                    cdd.setCanceledOnTouchOutside(false);
                    cdd.show();
 
  • Danke
Reaktionen: 123thomas

Ähnliche Themen

J
  • Juleru
Antworten
8
Aufrufe
497
Juleru
J
S
  • SlayNox
Antworten
0
Aufrufe
685
SlayNox
S
S
Antworten
2
Aufrufe
986
stikker
S
Zurück
Oben Unten