【问题标题】:onSaveInstanceState not workingonSaveInstanceState 不起作用
【发布时间】:2012-05-30 09:04:48
【问题描述】:

我知道这个问题已经被问了很多,但我不明白为什么 onSaveInstanceState 对我不起作用。这可能是一些愚蠢的事情,但我希望你们中的一些人能在这里帮助我。无论如何,这是我的代码:

public class Main extends Activity implements OnClickListener, OnKeyListener {

EditText textitem;
Button buttonadd;
ListView listitems;

ArrayList<String> ToDo;
ArrayAdapter<String> AA;
ArrayList<String> MyArrayList;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    textitem = (EditText) findViewById(R.id.textitem);
    buttonadd = (Button) findViewById(R.id.buttonadd);
    listitems = (ListView) findViewById(R.id.listitems);

    buttonadd.setOnClickListener(this);
    textitem.setOnKeyListener(this);

    ToDo = new ArrayList<String>();
    AA = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, ToDo);
    listitems.setAdapter(AA);

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putStringArrayList("MyArrayList", ToDo);
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    ArrayList<String> ToDo = savedInstanceState.getStringArrayList("MyArrayList");
}

private void addItem(String item) {
    if (item.length() > 0) {
        this.ToDo.add(item);
        this.AA.notifyDataSetChanged();
        this.textitem.setText("");
    }
}

public void onClick(View v) {
    if (v == this.buttonadd) {
        this.addItem(this.textitem.getText().toString());
    }
}

public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN
            && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
        this.addItem(this.textitem.getText().toString());
    }
    return false;
}

}

【问题讨论】:

    标签: android list task save


    【解决方案1】:
    public class Main extends Activity implements OnClickListener, OnKeyListener {
    
    EditText textitem;
    Button buttonadd;
    ListView listitems;
    
    ArrayList<String> ToDo;
    ArrayAdapter<String> AA;
    ArrayList<String> MyArrayList;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        textitem = (EditText) findViewById(R.id.textitem);
        buttonadd = (Button) findViewById(R.id.buttonadd);
        listitems = (ListView) findViewById(R.id.listitems);
    
        buttonadd.setOnClickListener(this);
        textitem.setOnKeyListener(this);
    
        if(savedInstanceState!=null)
         {
           ToDo = savedInstanceState.getStringArrayList("MyArrayList");
         }
        else
         {
           ToDo = new ArrayList<String>();
         }
        AA = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, ToDo);
        listitems.setAdapter(AA);
    
    }
    
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putStringArrayList("MyArrayList", ToDo);
        super.onSaveInstanceState(savedInstanceState);
    }
    
    
    private void addItem(String item) {
        if (item.length() > 0) {
            this.ToDo.add(item);
            this.AA.notifyDataSetChanged();
            this.textitem.setText("");
        }
    }
    
    public void onClick(View v) {
        if (v == this.buttonadd) {
            this.addItem(this.textitem.getText().toString());
        }
    }
    
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            this.addItem(this.textitem.getText().toString());
        }
        return false;
    }
    

    希望这会对您有所帮助。 维普尔

    【讨论】:

    • 非常感谢您的回复,我已经实施了您的解决方案,但它似乎仍然不起作用。如果我添加一些任务,请按“home”,然后再次打开应用程序,它会记住状态,但这是 onPause。如果我真的通过点击后退按钮关闭应用程序,然后再次打开它,则列表为空。你知道为什么会这样吗?
    【解决方案2】:

    您将其保存在局部变量中,为什么? 可以试试这个

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        this.ToDo = savedInstanceState.getStringArrayList("MyArrayList");
    }
    

    通常你在 onCreate 中恢复你的状态。也可以在 onRestoreInstanceState 中恢复它,但不是很常见。 (onRestoreInstanceState 在 onStart 之后调用,而 onCreate 在 onStart 之前调用。

    来自:onSaveInstanceState () and onRestoreInstanceState ()

    【讨论】:

      【解决方案3】:

      您在“onRestoreInstanceState()”回调中提取保存的值,但实际上您并没有对它们做任何事情。

      ArrayList<String> ToDo = savedInstanceState.getStringArrayList("MyArrayList");
      

      您需要将这些值包装在适配器中并将其分配给列表,就像您在 onCreate() 结束时所做的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多