Кнопка не работает при восстановлении с использованием SharedPreferences

#android

#Android

Вопрос:

У меня есть приложение, которое увеличивает просмотр кнопок одним нажатием кнопки (кнопка A). Увеличенные представления кнопок работают должным образом, выполняя код в их методе onClick.

Теперь, чтобы сохранить созданный макет, я веду подсчет количества нажатий на кнопку A и сохраняю это значение, используя SharedPreferences. В методе onCreate я создаю цикл for для количества нажатий на кнопку A и повторно раздуваю эти кнопки, создавая таким образом тот же макет, который был на экране, когда приложение было закрыто. Хотя теперь кнопки, сгенерированные в методе onCreate, больше не функционируют.

Надеюсь, я уловил какой-то смысл. Проблема в том, что при повторном запуске приложения в будущем оно создает макет таким, каким он был при нажатии на приложение, но просмотр кнопок больше не работает для метода onCLick.

Вот код для справки:

MainActivity.java

 public class MainActivity extends Activity {

EditText et;
String z, r;
LinearLayout ll;
SharedPreferences sp;
Button fb1;
int c=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    et=(EditText) findViewById(R.id.et);
    sp=getSharedPreferences("MY_PREFS", 0);
    if (sp.contains("counter")) {
        for (int i=1;i<=sp.getInt("counter", 1);i  ) {
            cr();}
    }
    c=sp.getInt("counter", 0);

}
public void cr() {
    ll=(LinearLayout) findViewById(R.id.ll);
    LayoutInflater li=getLayoutInflater();
    View vw=li.inflate(R.layout.infla, null);
    ll.addView(vw);
    fb1=(Button) vw.findViewById(R.id.btn);
    fb1.setId(c);
}
public void click(View v) {
    int z=v.getId();
    switch (z) {
    case (R.id.button):
        et=(EditText) findViewById(R.id.et);
        cr();
        et.setText("");
        c=c 1;
        break;
    }

    Editor e=sp.edit();
    //e.putString("check", r);
    e.putInt("counter", c);
    //e.putInt("id", c);
    e.commit();

    for (int i=0; i<=c;i  ){
        if (z%2==0) {//Present
            et.setText("Present");}
        else if(z%2==1)
            et.setText("Absent");
        }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}
  

activity_main.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/ll"
tools:context=".MainActivity" >

<EditText
    android:id="@ id/et"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="0dp"
    android:ems="10"
    android:hint="Enter something" >

    <requestFocus />
</EditText>

<Button
    android:id="@ id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="0dp"
    android:onClick="click"
    android:text="Click" />

<Button
    android:id="@ id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="remove" />

</LinearLayout>
  

infla.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
    android:id="@ id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    android:onClick="click" />

</LinearLayout>
  

Ответ №1:

Редактировать: Похоже, вы присвоили кнопке избыточные идентификаторы во время инициализации.Каждой кнопке будет присвоено значение ‘c’ вместо 0 на ‘c’.

Кроме того, кажется логичным также создавать прослушиватели кликов на лету, поскольку вы раздуваете кнопку на ходу.Попробуйте реализовать onclicklistener вместо встроенного метода click() в xml. т.е.

 public void cr() {
   ll=(LinearLayout) findViewById(R.id.ll);
   LayoutInflater li=getLayoutInflater();
   View vw=li.inflate(R.layout.infla, null);
   ll.addView(vw);
   fb1=(Button) vw.findViewById(R.id.btn);
   fb1.setId(c);
   fb1.setOnClickListener(new View.OnClickListener(){
 //Stuff you wish to do on click
   });
}
  

Комментарии:

1. Не работает. Я думаю, это потому, что каждый раз, когда для работы прослушивателя кликов вам придется вызывать метод cr (). Есть другие предложения?

2. Ваш код предполагает, что вы неправильно присваиваете значения id, т. Е. в вашем методе onCreate () все созданные кнопки имеют одинаковое значение для id, т. е. ‘c’.

3. Человек!! Не могу поверить, что это была ошибка!! Огромное спасибо! PS — если бы вы могли просто изменить свой ответ на приведенный выше, чтобы я мог поставить ему зеленую галочку. Еще раз спасибо!!