2011-08-11 49 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

相關問題