dialog Objekt refreshen

  • 7 Antworten
  • Letztes Antwortdatum
Y

Yrrel

Neues Mitglied
0
Hallo an alle. Dies ist mein erster Beitrag in diesem Forum, deswegen falls ich etwas im falschen Topic habe bitte einfach freundlich darauf hinweisen und ich werde das beheben^^.

Zu meiner Frage:
Ich versuche einen Dialog dynamisch zu verändern. Der betreffende Textausschnitt lautet:

Code:
public class MainActivity extends Activity {
    final protected int DIALOG = 0;
    private int trAnzahl=2;
   


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ScrollView sv = new ScrollView(this);
        TableLayout tl = new TableLayout(this);
        tl.setOrientation(LinearLayout.VERTICAL);
        Button bt = new Button(this);
        bt.setId(0);
        bt.setText("Dialog aufrufen");
        bt.setOnClickListener(listener);
        tl.addView(bt);
        sv.addView(tl);
          
        this.setContentView(sv);

    }
   
    private OnClickListener listener = new OnClickListener(){
        public void onClick(View v){
            switch(v.getId()){
            case DIALOG : Toast toast = Toast.makeText(v.getContext(), "Button gedrückt",Toast.LENGTH_SHORT);toast.show();
                        showDialog(DIALOG);break;
           
           
            }
        }
       
    };

    protected Dialog onCreateDialog(int id) {
        Dialog ergebnis = null;
        switch(id) {
           case DIALOG: ergebnis= erzeugeDialog();break;

        }

        return ergebnis;
    }
    private Dialog erzeugeDialog(){
        Dialog dialog = new Dialog(this);
        ScrollView sv = new ScrollView(this);
        sv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        dialog.setContentView(sv); 
       
        TableLayout tl = new TableLayout(this);
        tl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        
        Button bt = new Button(this);
        bt.setText("Hinzufügen");
        tl.addView(bt);
        bt.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Toast toast = Toast.makeText(v.getContext(),""+trAnzahl,Toast.LENGTH_SHORT); toast.show();
                trAnzahl++;
            }
          });    

        for(int i = 1; i <= trAnzahl; i++){
            TableRow tr = new TableRow(this);
            tr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
            TextView tv = new TextView(this);
             tv.setText("Nummer"+i);
            tr.addView(tv);
            tl.addView(tr);
        }
        sv.addView(tl);
     

       
        return dialog;
       
    }
}
Das Programm erzeugt einfach einen Dialog mit einem Button und 2 Reihen. Diese sollen durch den Buttton bei jedem Klick um eine Reihe erweitert werden.
Im Prinzip läuft es auch alles super, nur wird irgendwie der Dialog nicht geupdatet und bleibt immer auf dem Stand der ersten erzeugung.(Reihen Counter zählt hoch aber View bleibt stehen). Ich habe auch schon die OnPrepare Methode versucht, oder einfach neues Dialog Objekt erzeugen, aber irgendwie scheint der Fehler wo anders zu stecken.

Weiß jemand was ich tun könnte, oder habe ich einen komplett falschen Ansatz?

PS: Gibt es einen Weg die Java Texte schöner hier im Forum einzubetten?
 
Zuletzt bearbeitet:
[ C O D E ] [ / C O D E ]

mit diesen Tag kannst du Code "schön" darstellen, wäre schön wenn du das machen könntest, dann kann man dein code besser lesen :thumbup:
 
ein dialog wird nur einmal über oncreateDialog erstellt


du musst für updates onPrepareDialog nutzen. das wird jedesmal beim öffnen des dialoges aufgerufen
 
Erstmal Danke für die Antworten^^

Zur onPrepareDialog:
Hat bei mir auch nicht funktioniert.

Vllt. hab ich ja onPrepare falsch aufgerufen, könnte mir evtl jemand genau beschreiben was während dem onPrepare abläuft und welche konsequenzen es hat, bzw wie man es richtig anwendet?
 
Wenn du onPrepareDialog(int id, Dialog dialog) benutzen willst, dann mußt du den Dialog aber auch über onCreateDialog(int id) erzeugen:

Bsp.:
Code:
private final static int DIALOG_HINWEISE = 1;
.
.
.
@Override
protected Dialog onCreateDialog(int id) {
	LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
	AlertDialog.Builder builder;
	switch (id) {
		case DIALOG_HINWEISE:
			final LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.hinweis_dialog, (ViewGroup)findViewById(R.id.hinweis_dialog_layout));
			listViewHinweis = (ListView)layout.findViewById(R.id.hinweis_listview);
			adapterHinweis = new HinweisArrayAdapter(this, R.layout.hinweis_adapter_layout, listHinweis);
			listViewHinweis.setAdapter(adapterHinweis);
			
    		builder = new AlertDialog.Builder(this);
    		builder.setView(layout)
               	   .setCancelable(false)
               	   .setPositiveButton("OK", new DialogInterface.OnClickListener() {
               		   public void onClick(DialogInterface dialog, int id) {
               			   saveHinweise();
               			   dialog.dismiss();
               		   }
               	   })
               	   .setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
               		   public void onClick(DialogInterface dialog, int id) {
               			   dialog.dismiss();
               		   }
               	   });

    		return builder.create();

		default:
			return null;
	}
}

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
    	super.onPrepareDialog(id, dialog);
    	
    	switch(id) {
			case DIALOG_HINWEISE:
				updateHinweise();
				// scroll listview always to first row
				if (listViewHinweis != null) {
					listViewHinweis.setSelection(0);
				}
		    	break;
		    			    	
	    	default:
	    		break;
		}    	
    }

Wenn du den Dialog selbst erstellst, mußt du dich auch selbst ums update / prepare kümmern.
 
Nur so nebenbei:
Wieso kann ich nicht mit dem Button aus dem Dialog die Methode dialog.dismiss() oder dialog.cancel() aufrufen? Wie soll ich sonst den Dialog schließen ausser mit zurück oder nem cancel-Button?

Zum onPrepare: Habs versucht, funktioniert aber irgendwie nicht:
Code:
    protected void onPrepareDialog(int dialogId,Dialog dialog){
        super.onPrepareDialog(dialogId, dialog);
        switch(dialogId){
        case DIALOG : break;
        }
Ich muss ja nichts im onPrepare machen, da der Dialog selbst seine neuen Views hinzufügt, WENN er sich denn mal updaten würde.

Ich bin langsam am verzeifeln, ich hab jetzt wirklich schon viel Zeit in dieses Problem investiert, komme aber auf keinen grünen Zweig.

Als altenative Möglichkeiten zur Problemlösung hab ich noch im Internet was gefunden mit nem invalidate() Aufruf, der angeblich den Dialog refreshen soll und die Möglichkeit, den Dialog in ne externe Klasse auszulagern.
Was soll ich tun? Ich glaub ich seh den Wald langsam vor lauter Bäumen nicht mehr.
 
Das glaub ich auch ;)
Dein View-Erzeugungs-Code solltest du vielleicht einfach in den Listener schreiben ;)

Gesendet von meinem MB525 mit Tapatalk 2
 
Dann versuchs mal mit einer externen Klasse, das mach ich mittlerweile auch meistens -> public class MyDialog extends Dialog ...
 
Zurück
Oben Unten