Обновление просмотра текста в пользовательском диалоге с помощью кнопки - PullRequest
0 голосов
/ 19 апреля 2011

Итак, моя текущая проблема заключается в том, что я не могу найти элегантный способ обновить диалоговое окно при нажатии кнопки. Функционально я могу достичь того же результата с помощью dismiss () и 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.

Я попытался обработать это так же, как я делал с помощью средства обновления моего основного действия updateScreen (), которое является Runnable, то есть длинным списком setTexts и / или недействительными, и является runOnUiThread(updateScreen). Прекрасно работает для основной деятельности.

Я сделал несколько копий пасты и попытался создать updateSellScreen (), заставить его подключаться к текстовым представлениям настраиваемого диалога, но он не может разрешить класс предупреждений ... Я сейчас немного потерялся.

Возможно ли это, даже не разрушая все и просто создавая собственное представление (которое я очень не хочу пытаться заняться этим заново в программировании на Android ...)

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Объявите ваши TextViews как окончательные. Вы по-прежнему сможете устанавливать их тексты, это просто означает, что вы не сможете переназначить ссылки на переменные. Не делайте 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())+")");


           }
        }
    });
1 голос
/ 19 апреля 2011

В упражнении, в котором вы создаете свой диалог, вы можете объявить закрытые переменные диалогового окна, текстовых представлений и т. Д., Тогда они будут доступны в любом месте действия.

        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();
...