1

嗨,我想知道为什么更新按钮的文本在我的应用程序中表现不同。

我调用一个片段来获取应该更新按钮的信息,我从片段执行接口回调以更新活动更新按钮文本的全局变量。

问题是按钮所在的活动不会刷新按钮以显示新文本,但如果我通过它工作的片段进行操作,如果我通过活动进行操作,使按钮无效或强制刷新.

这是当您按下按钮然后调用显示列表的片段时调用的活动,当您单击选项时,按钮应将其文本更改为您选择的任何内容:

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

我的问题是,为什么它通过片段而不是通过活动更新gui上的文本(运行应用程序时),即方法p1_button.setText(响应);?

Raghunandan 解释的编辑答案:问题是onClick_testSite(View view)即使您没有单击对话框上的任何内容,我也不明白它已完成,我认为它等待函数调用chartType.show()返回,然后继续到函数的末尾.

4

2 回答 2

1

你需要初始化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上面的 hwon。

于 2014-01-09T08:59:25.053 回答
1

processFinish将值保存到response。但它不适用于带有btn_pickChart id 的 TextView。

因此,您只需为 Activity 保存 TextView 的实例:

private Button mP1Button;

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

并在调用 processFinish时应用更改的值:

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

最好不要使用委托作为字段。您可以使用 getActivity() 或 getTargetFragment() 检查 instanceOf 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之后不需要调用invalidate方法,因为它已经从这里调用了。

于 2014-01-09T09:39:33.747 回答