2011-08-11 19 views
0

在活动的事件调用中,我打开了一个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()。

任何人都可以帮我吗?

在此先感谢!

+0

你能提供更多的代码吗? – Martyn

+0

请参阅修改过的来源! – Renjith

回答

0

在当前位置updateUI(),你想之前在AlertDialog.Builder设置访问ItemMap.item。你会需要一些方法在AlertDialog.Builder调用从onClick回你的主类 - 我会通过增加一个接口,然后通过在你的建设者做到这一点 - 是这样的:

活动类:

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

没有问题 - 关于这种方法的一个有趣的点要注意的是,我们正在使用这种附加方法保持构建器设计模式你的'Mybuilder'类通过返回实际的构建器本身。如果你不熟悉Builder设计模式(http://sourcemaking.com/design_patterns/builder)和一般设计模式(http://sourcemaking.com/design_patterns),请阅读它们。 – Martyn

0

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

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

}

0

你错在这里做的事情的负载。你可以在移动updateUI()到的onClick在你的活动,这应该工作,但这里的另一个几点思考:

  1. 为什么在不同类的AlertDialog.Builder?如果你打算用一些额外的行为来扩展它,并在你的应用程序的其他地方使用它,这是正常的 - 如果你只是在这里使用它,那么你应该在你的活动中声明它。
  2. 为什么你的ItemMap.item是静态的?这是一个设计决定吗?
+0

是的,我在应用程序的某个部分扩展了相同的行为。保持ItemMap.item是一个设计决策。 – Renjith

+0

好的 - 只是想确认:)我会添加一个新的答案,详细说明如何解决这个问题 – Martyn

相关问题