#android #eclipse #dialog #settext
#Android #eclipse #диалоговое окно #settext
Вопрос:
Итак, моя текущая проблема заключается в том, что я не могу найти элегантный способ обновить диалоговое окно при нажатии кнопки. Я могу достичь функционально того же результата с помощью dismiss () и show (), но это некрасиво.
Допустим, в этом диалоговом окне есть 3 кнопки для продажи виджетов, которые есть у плеера. Продать все, продать 10 и продать X (сумма, введенная с помощью EditText). Я бы хотел, чтобы диалоговое окно сохранялось, если игрок нажимает Sell 10, но также обновил его textviews новым количеством виджетов.
Соответствующая часть 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 .
Я попытался обработать это так, как я делал с помощью программы обновления моего основного действия updateScreen(), которая является Runnable
, то есть длинным списком setTexts и / или недействительными, и является runOnUiThread(updateScreen)
. Отлично работает для базового действия.
Я сделал некоторую копипасту и попытался создать updateSellScreen (), заставить его подключаться к textviews пользовательского диалога, но он не может разрешить класс alert… Теперь я немного потерялся.
Возможно ли это вообще без уничтожения всего и простого создания пользовательского представления (которое я очень не люблю пытаться использовать в программировании для Android …)
Комментарии:
1. Чтобы уточнить, строка:
updateScreen();
в списке обрабатывает только активность главной страницы. Я не могу согласовать объем вещей, достаточный для того, чтобы заставить его работать в диалоговом окне, отсюда и вопрос.
Ответ №1:
Объявите ваши текстовые представления как окончательные. Вы по-прежнему сможете устанавливать их тексты, это просто означает, что вы не сможете переназначать ссылки на переменные. Не делайте alert.tv поскольку TextView является не переменной экземпляра вашего диалога, а скорее методом, с помощью которого вы создаете свой диалог. Это простой способ. Вы также можете объявить свои TextViews в качестве переменных экземпляра вашей активности, а затем обновить их с помощью обработчика.
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()) ")");
}
}
});
Комментарии:
1. Это сработает, и спасибо вам за хорошее объяснение
final
и за то, что помогли мне лучше разобраться с областью видимости переменных в java
Ответ №2:
В activity, где вы создаете свой диалог, вы можете объявить закрытые переменные dialog, textviews и т.д., Тогда они будут доступны в любом месте activity.
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. У меня уже есть такая структура в моем коде. что я хочу сделать, так это из
onClick
метода выполнить tv1.setText («foo»);2. В вашем коде tvsellAll является локальным для диалога, в моем коде tv1 принадлежит родительской активности.
3. когда я использую аналогичный код, я по-прежнему получаю ошибку компилятора, когда внутри onClick я использую tv1.setText(«foo») :: Не удается сослаться на не окончательную переменную tvsell10 внутри внутреннего класса, определенного другим методом. Если я сделаю его окончательным, он не позволит мне установить. Я так запутался: (