#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 — если бы вы могли просто изменить свой ответ на приведенный выше, чтобы я мог поставить ему зеленую галочку. Еще раз спасибо!!