Вопрос

Привет, мне было интересно, почему обновление текста кнопки в моем приложении ведет себя по-другому.

Я вызываю фрагмент, который получает информацию о том, какую кнопку следует обновить, я выполняю обратный вызов интерфейса из фрагмента, чтобы обновить глобальную переменную, с помощью которой действие обновляет текст кнопки.

Проблема в том, что действие, в котором расположена кнопка, не обновляет кнопку, чтобы отобразить новый текст, но если я делаю это через фрагмент, он работает, аннулирование кнопки не работает или принудительное обновление, если я делаю это через действие. .

Вот действие, которое вызывается, когда вы нажимаете кнопку, а затем вызывает фрагмент, который показывает список, и когда вы нажимаете на опцию, кнопка должна изменить свой текст на любой, который вы выбрали:

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

и вот часть фрагмента, обрабатывающего диалог:

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

Мой вопрос: почему он обновляет текст в графическом интерфейсе (при запуске приложения) через фрагмент, а не через действие, то есть метод p1_button.setText(response);?

РЕДАКТИРОВАТЬ ответ, как объяснил Рагунандан:Проблема была в том, что я этого не понял onClick_testSite(View view) завершено, даже если вы ничего не нажимали в диалоговом окне, я думал, что оно ожидает вызова функции chartType.show() чтобы он вернулся, а затем перешел к концу функции.

Это было полезно?

Решение

Вам необходимо инициализировать public AsyncResponse delegate = null;

delegate =(AsyncResponse) getActivity();

Я считаю, что это реализованный метод

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

Объявить Button p1_button как переменная экземпляра (например, перед onCreate).

Инициализируйте это

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

Вероятно, кнопка обновляется еще до получения ответа в processFinish.Затем вы инициализируете переменную ответа.Таким образом, текст кнопки будет установлен при следующем нажатии на кнопку.

Вы можете объявить кнопку перед onCreate и обновить ее в processFinish вместо Хвона выше.

Другие советы

А процессГотово сохраняет значение в ответ.Но это не относится к TextView с btn_pickChart идентификатор.

Итак, вам просто нужно сохранить экземпляр TextView для Activity:

private Button mP1Button;

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

И примените измененное значение, когда процессГотово называется:

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

Лучше всего не использовать делегата в качестве поля.Вы можете использовать getActivity() или getTargetFragment() для проверки экземпляра AsyncResponse и вызова метода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);
}

Кстати, не обязательно звонить. признать недействительным метод после setText потому что он уже вызван отсюда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top