将值设置为活动中的textview

时间:2011-08-11 08:53:26

标签: android android-layout

在活动的事件调用中,我打开了一个AlertDialog.Builder,它列出了一个单选项的数组。当用户点击任何项目时,我想将其设置为活动中的文本视图。

I tried this:
Activity class:
public MyActivity extends Activity implements onClickListener {
     TextView item;
     public void onCreate(Bundle state) {
        super.onCreate(savedState);
        setContentView(R.layout.main);
        item = (TextView) findViewById(R.id.id_item);
        item .setOnClickListener(this);
     }
     public void onClick(View v) {
          new MyBuilder(this).show();
          updateUI();
     }
     private void updateUI() {
          item.setText(ItemMap.item);
     }
}

Builder class: 

public class MyBuilder extends AlertDialog.Builder implements OnClickListener{

Context context;
String[] items = {"pen", "pencil", "ruler"};
public MyBuilder(Context context) {
    super(context);
    super.setTitle("Select Item");
    this.context = context;
    super.setSingleChoiceItems(items, 0, this);

}

@Override
public void onClick(DialogInterface dialog, int position) {
    ItemMap.item = items[position];
    dialog.dismiss();
}
}

Mapping class: 

public class ItemMap {
    public static String item;
}

这里,MyBuilder是一个扩展AlertDialog.Builder的子类 updateUI()尝试设置用户从项列表中选择的值。但它不起作用!显示对话框后立即调用updateUI()。

有人可以帮帮我吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

将updateUI()从MyActivity onClick()移动到onClick for Dialog。

@Override
public void onClick(DialogInterface dialog, int position) {
   ItemMap.item = items[position];
   updateUI();
   dialog.dismiss();

}

答案 1 :(得分:0)

你这里做错了。您可以将updateUI()移动到您的活动中的onClick,这应该可以工作,但这里还有一些需要考虑的事情:

  1. 为什么你的AlertDialog.Builder在另一个班级?如果你想用一些额外的行为来扩展它并在你的应用程序的其他地方使用它,那就没关系了 - 如果你只是在这里使用它,那么你应该在你的活动中声明它。
  2. 为什么你的ItemMap.item是静态的?这是一个设计决定吗?

答案 2 :(得分:0)

在当前位置updateUI(),您在ItemMap.item中设置之前尝试访问AlertDialog.Builder。您需要某种方式从onClick中的AlertDialog.Builder回调到您的主类 - 我会通过添加一个接口然后将其传递给您的构建器来执行此操作 - 如下所示:

活动类:

public MyActivity extends Activity implements onClickListener, AlertBuilderCallback {
     TextView item;
     public void onCreate(Bundle state) {
        super.onCreate(savedState);
        setContentView(R.layout.main);
        item = (TextView) findViewById(R.id.id_item);
        item .setOnClickListener(this);
     }
     public void onClick(View v) {
          new MyBuilder(this).addCallback(this).show();
          updateUI();
     }
     public void updateUI() {
          item.setText(ItemMap.item);
     }
}

AlertBuilderCallback接口:

public interface AlertBuilderCallback {
    public void updateUI();
}

构建器类:

 public class MyBuilder extends AlertDialog.Builder implements OnClickListener{

    Context context;
    String[] items = {"pen", "pencil", "ruler"};
    public MyBuilder(Context context) {
        super(context);
        super.setTitle("Select Item");
        this.context = context;
        super.setSingleChoiceItems(items, 0, this);
    }

    public MyBuilder addCallback(AlertBuilderCallback callBack) {
        this.callBack = callBack;
        return this;
    }

    @Override
    public void onClick(DialogInterface dialog, int position) {
        ItemMap.item = items[position];
        if(this.callBack != null) {
            this.callBack.updateUI();
        }
        dialog.dismiss();
    }
}

映射类:

public class ItemMap {
    public static String item;
}