Question

Salut, je me demandais pourquoi la mise à jour du texte d'un bouton se comporte différemment dans mon application.

J'appelle un fragment qui obtient les informations avec lesquelles le bouton doit être mis à jour, j'effectue un rappel d'interface à partir du fragment pour mettre à jour une variable globale avec laquelle l'activité met à jour le texte du bouton.

Le problème est que l'activité où se trouve le bouton n'actualise pas le bouton pour afficher le nouveau texte mais si je le fais via le fragment, cela fonctionne, invalider le bouton ne fonctionne pas ou forcer l'actualisation si je le fais via l'activité. .

Voici l'activité qui appelle lorsque vous appuyez sur le bouton qui appelle ensuite un fragment qui affiche une liste et lorsque vous cliquez sur une option, le bouton doit changer son texte comme celui que vous avez choisi :

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;
}

et voici une partie du fragment qui gère la boîte de dialogue :

@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);
}

Ma question est la suivante : pourquoi met-il à jour le texte sur l'interface graphique (lors de l'exécution de l'application) via le fragment mais pas via l'activité, c'est-à-dire la méthode p1_button.setText(response) ?

MODIFIER la réponse comme expliqué par Raghunandan :Le problème c'est que je n'ai pas compris ça onClick_testSite(View view) terminé même si vous n'avez rien cliqué sur la boîte de dialogue, je pensais qu'il attendait avec l'appel de fonction de chartType.show() pour qu'il revienne puis passez à la fin de la fonction.

Était-ce utile?

La solution

Vous devez initialiser public AsyncResponse delegate = null;

delegate =(AsyncResponse) getActivity();

Je crois que c'est la méthode mise en œuvre

@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);
}

Déclarer Button p1_button comme variable d'instance (par exemple avant onCreate).

Initialisez ceci

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

Le bouton est probablement actualisé avant même que la réponse ne soit reçue processFinish.Ensuite, vous initialisez la variable de réponse.Ainsi, le texte du bouton est défini la prochaine fois que vous cliquez sur le bouton.

Vous pouvez déclarer le bouton avant onCreate et le mettre à jour dans processFinish au lieu de ce qui est indiqué ci-dessus.

Autres conseils

La Processfinish enregistre la valeur à la réponse .Mais il ne s'applique pas à TextView avec BTN_PICKCHART ID.

Donc, il vous suffit de sauvegarder l'instance de TextView pour l'activité:

private Button mP1Button;

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

et appliquer la valeur modifiée lorsque PROCESSFINISH est appelé:

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

Pour le meilleur moyen, n'utilisez pas le délégué comme champ.Vous pouvez utiliser la getActivity () ou GetTargetFraGment () pour vérifier l'instance de Asyncresponse et appelez la méthode Processfinish.

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

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

Au fait, pas besoin d'appeler la méthode Invalidate après Settext car il est déjà appelé d'ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top