Frage

Hallo, ich habe mich gefragt, warum sich das Aktualisieren des Textes einer Schaltfläche in meiner App anders verhält.

Ich rufe ein Fragment auf, das die Information erhält, womit die Schaltfläche aktualisiert werden soll, ich mache einen Schnittstellenrückruf aus dem Fragment, um eine globale Variable zu aktualisieren, mit der die Aktivität den Schaltflächentext aktualisiert.

Das Problem ist, dass die Aktivität, in der sich die Schaltfläche befindet, die Schaltfläche nicht aktualisiert, um den neuen Text anzuzeigen, aber wenn ich es über das Fragment mache, funktioniert es nicht, die Schaltfläche ungültig zu machen oder die Aktualisierung zu erzwingen, wenn ich es durch mache die Aktivität.

Hier ist die Aktivität, die aufgerufen wird, wenn Sie die Taste drücken, die dann ein Fragment aufruft, das eine Liste anzeigt, und wenn Sie auf eine Option klicken, sollte die Schaltfläche ihren Text in den von Ihnen gewählten Text ändern:

public void onClick_testSite(View view)
{
    // create the fragment
    SelectChartTypeDialogFragment chartType = new SelectChartTypeDialogFragment();
    // register you as a delegate for the callback
    chartType.delegate = this;
    // show the list
    chartType.show(getFragmentManager(), "WEE");

    // fetch the button and set the text ** DOESNT WORK **
    Button p1_button = (Button)findViewById(R.id.btn_pickChart);
    p1_button.setText(response);
    p1_button.invalidate();


}

@Override
public void processFinish(String response)
{
    this.response = response;
}

und hier ist ein Teil des Fragments, das den Dialog behandelt:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    // get the list from a enum
    final List<ChartTypes> chartList = Arrays.asList(ChartTypes.values());
    // The array containing the different choices
    ArrayAdapter<ChartTypes> adapter = new ArrayAdapter<ChartTypes>(
            getActivity(), android.R.layout.simple_list_item_1, chartList);
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // The dialog setting
    builder.setTitle(R.string.pick_chart);
    builder.setAdapter(adapter, new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int position)
        {
            // get the name of the enum based on the position, what one
            // clicked on the dialog
            String strName = chartList.get(position).name();

            // this sets the text in the activitys global variable
            delegate.processFinish(strName);
            // set the text in the fragment instead
            //changeBtnText(strName);

            //dialog.dismiss();
        }
    });

    // Create the AlertDialog object and return it
    return builder.create();
}

public void changeBtnText(String newBtnxt)
{
    Button button = (Button)getActivity().findViewById(R.id.btn_pickChart);
    button.setText(newBtnxt);
}

Meine Frage ist, warum der Text auf der GUI (beim Ausführen der App) über das Fragment aktualisiert wird, aber nicht über die Aktivität, dh die Methode p1_button.setText(Antwort);?

Antwort bearbeiten, wie von Raghunandan erklärt:Das Problem war, dass ich das nicht verstanden habe onClick_testSite(View view) abgeschlossen auch wenn Sie nichts auf den Dialog geklickt haben, dachte ich, dass er mit dem Funktionsaufruf von gewartet hat chartType.show() damit es zurückkehrt und dann mit dem Ende der Funktion fortfährt.

War es hilfreich?

Lösung

Sie müssen initialisieren public AsyncResponse delegate = null;

delegate =(AsyncResponse) getActivity();

Ich glaube, das ist die implementierte Methode

@Override
public void processFinish(String response)
{
     Log.i(".........",response); // check if the response is logged
     // if you get the response your button text will be changed
     // else you need to look at why the response is not logged.  
     p1_button.setText(response);
}

Erklären Button p1_button als Instanzvariable (zum Beispiel vor onCreate).

Initialisieren Sie dies

p1_button = (Button)findViewById(R.id.btn_pickChart); // in onCreate

Wahrscheinlich wird die Schaltfläche aktualisiert, noch bevor die Antwort eingeht processFinish.Dann initialisieren Sie die Antwortvariable.Der Schaltflächentext wird also beim nächsten Klick auf die Schaltfläche festgelegt.

Sie können die Schaltfläche vor onCreate deklarieren und in aktualisieren processFinish stattdessen hwon oben.

Andere Tipps

Der prozessFinish speichert den Wert in Antwort.Aber es gilt nicht für TextView mit btn_pickChart ID.

Sie müssen also nur die Instanz von TextView für die Aktivität speichern:

private Button mP1Button;

protected void onCreate(Bundle savedInstanceState) {
...
    Button mP1Button = (Button) findViewById(R.id.btn_pickChart);
...
}

Und wenden Sie den geänderten Wert an, wenn prozessFinish wird aufgerufen:

public void processFinish(String response) {
    this.response = response;
    // The value will be setup to the view element.
    mP1Button.setText(response);
}

Verwenden Sie den Delegaten am besten nicht als Feld.Sie können getActivity() oder getTargetFragment () verwenden, um die Instanz von AsyncResponse zu überprüfen und die processFinish-Methode aufzurufen.

AsyncResponse asyncResponse = null;
if(getActivity() instanceof AsyncResponse) {
    asyncResponse = (AsyncResponse) getActivity();
} else if (getTargetFragment() instanceof AsyncResponse){
    asyncResponse = (AsyncResponse) getTargetFragment();
}

if(asyncResponse != null){
    asyncResponse.processFinish(strName);
}

Übrigens, keine Notwendigkeit, den anzurufen ungültig methode nach setText weil es schon von hier aus aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top