使用SharedPreferences还原时按钮不起作用

时间:2014-07-04 19:26:02

标签: 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 个答案:

答案 0 :(得分:0)

编辑: 您似乎在初始化期间为按钮分配了冗余ID。每个按钮将被赋值为'c'而不是0到'c'。

此外,在动态创建点击侦听器似乎也是合乎逻辑的,因为你在go上充气按钮。尝试在xml中实现onclicklistener而不是硬连线click()方法。 即

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
   });
}