所以,我当前的问题是,当按下按钮时,我无法找到更新对话框的优雅方法。
和show()可以在功能上获得相同的结果,但这很难看。让我们说这个对话框有3个按钮,用于销售玩家拥有的小部件。卖出全部卖出10卖出X(用EditText输入的金额)。如果播放器推送卖出10,我希望对话框能够持续存在,而且还要用新的小部件计数来更新它的文本视图。
自定义对话框的XML布局的相关部分:
<LinearLayout android:id="@+id/linearLayout3" android:layout_height="wrap_content" android:layout_width="match_parent">
<TextView android:id="@+id/sell10Text" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:layout_weight="2"></TextView>
<Button android:text="Sell 10" android:enabled="false" android:layout_width="wrap_content" android:id="@+id/sell10Button" android:layout_height="wrap_content" android:layout_weight="1"></Button>
</LinearLayout>
对话框创建的相关部分:
final Dialog alert = new Dialog(this);
alert.setTitle("Sell how many "+(masterRes.get(currentResIndex).getName())+"?");
alert.setContentView(R.layout.selldialog);
TextView tvsellAll = (TextView) alert.findViewById(R.id.sellAllText);
TextView tvsell10 = (TextView) alert.findViewById(R.id.sell10Text);
//etc etc more handles, including buttons
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
// etc etc more setTexts
btnsell10.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
if (v.isEnabled()) {
int y=masterRes.get(currentResIndex).getHeld();
masterRes.get(currentResIndex).setHeld(y-10);
held -= 10;
money += (calcCost(10));
updateScreen();
alert.tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
alert.tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
alert.tvsellAmt.setText("Sell Amount (0-"+String.valueOf(masterRes.get(currentResIndex).getHeld())+")");
}
}
});
// etc etc other button handlers, alert.show() at the end
现在显然按钮中的setTexts无法解析,因为他们看不到我创建的警报,他们只看到OnClickListener。
我尝试使用我的主要活动的updater updateScreen(),这是一个Runnable
,这是一个很长的setTexts和/或无效列表,并且是runOnUiThread(updateScreen)
。适用于基础活动。
我做了一些copypasta并试图创建一个updateSellScreen(),让它挂钩到自定义对话框的textview,但它无法解析警报类......我现在有点迷失了。
这是否有可能不会破坏所有内容而只是创建一个自定义视图(我非常反对尝试解决这个新的Android编程...)
答案 0 :(得分:1)
在您创建对话框的活动中,您可以声明对话框,文本视图等的私有变量,然后可以在活动的任何位置访问它们。
dialogA = new Dialog(myActivity.this, android.R.style.Theme_Dialog);
dialogA.setContentView(R.layout.myDialog);
// ...
tv1 = (TextView) dialogA.findViewById(R.id.textView1);
Button b1 = (Button) dialogA.findViewById(R.id.button1);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s1 = tv1.getText().toString();
Toast.makeText(myActivity.this, s1, Toast.LENGTH_SHORT).show();
dialogA.cancel();
}
});
dialogA.show();
答案 1 :(得分:1)
将TextViews声明为final。您仍然可以设置文本,这只意味着您将无法重新分配变量引用。不要做alert.tv,因为TextView不是对话框的实例变量,而是用于创建对话框的方法。这是简单的方法。您还可以将TextViews声明为Activity的实例变量,然后通过处理程序更新它们。
alert.setTitle("Sell how many "+(masterRes.get(currentResIndex).getName())+"?");
alert.setContentView(R.layout.selldialog);
final TextView tvsellAll = (TextView) alert.findViewById(R.id.sellAllText);
final TextView tvsell10 = (TextView) alert.findViewById(R.id.sell10Text);
//etc etc more handles, including buttons
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
// etc etc more setTexts
btnsell10.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
if (v.isEnabled()) {
int y=masterRes.get(currentResIndex).getHeld();
masterRes.get(currentResIndex).setHeld(y-10);
held -= 10;
money += (calcCost(10));
updateScreen();
tvsellAll.setText("Sell All ("+String.valueOf(masterRes.get(currentResIndex).getHeld())+") - $"+String.valueOf(calcCost(masterRes.get(currentResIndex).getHeld())));
tvsell10.setText("Sell 10 - $"+String.valueOf(calcCost(10)));
tvsellAmt.setText("Sell Amount (0-"+String.valueOf(masterRes.get(currentResIndex).getHeld())+")");
}
}
});