java还原安卓中活动的动态UI元素
我在很大程度上一直在追随投票率最高的答案
Here以及一些其他答案中的一些。我正在尝试处理配置更改或任何调用onSaveInstanceState()
/onRestoreInstanceState()
的操作。
到目前为止,我能够恢复文本视图(正确吗?),但我在动态添加ui元素(如ImageButtons)时遇到了问题,在我的示例中,按钮没有被还原。这可能是件愚蠢的事,但我已经避免寻求帮助够久了。我在某处看到有人提到保存物品以便打包。。。。但这似乎更直截了当。
谢谢你的建议
哦,我只在emulator上进行了测试,在横向/纵向之间旋转
编辑:更新了一个工作示例和来自@18446744073709551615的建议。感谢大家的帮助,看起来保存整个对象可能是更复杂代码的更好方法
基本xml布局:
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:tools="http://schemas.安卓.com/tools"
安卓:id="@+id/LinearLayout1"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:orientation="vertical"
安卓:paddingBottom="@dimen/activity_vertical_margin"
安卓:paddingLeft="@dimen/activity_horizontal_margin"
安卓:paddingRight="@dimen/activity_horizontal_margin"
安卓:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
安卓:id="@+id/textView1"
安卓:layout_width="wrap_content"
安卓:layout_height="wrap_content"
安卓:text="Hello" />
<Button
安卓:id="@+id/button2"
安卓:layout_width="wrap_content"
安卓:layout_height="wrap_content"
安卓:onClick="set"
安卓:text="Button" />
<Button
安卓:id="@+id/button1"
安卓:layout_width="wrap_content"
安卓:layout_height="wrap_content"
安卓:onClick="add"
安卓:text="Button" />
</LinearLayout>
这只是一个稍加修改的空白活动:
package com.example.savestate;
import 安卓.os.Bundle;
import 安卓.app.Activity;
import 安卓.util.Log;
import 安卓.view.View;
import 安卓.view.ViewGroup.LayoutParams;
import 安卓.widget.ImageButton;
import 安卓.widget.LinearLayout;
import 安卓.widget.TextView;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
int btnId = 0;
int myBtns;
LinearLayout panel;
TextView textView;
String myString;
ImageButton[] btnArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "begin of creation, myString is " + myString);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
Log.d(TAG, "end of creation, myString is: " + myString);
}
@Override
protected void onResume() {
super.onResume();
textView.setText(myString);
restoreBtns();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("MyString", "Welcome back");
savedInstanceState.putInt("MyBtns", btnId);
Log.d(TAG, "on save, myString is: " + myString);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
myString = savedInstanceState.getString("MyString");
myBtns = savedInstanceState.getInt("MyBtns");
Log.d(TAG, "on restore, myBtns is: " + myBtns);
Log.d(TAG, "on restore, myString is: " + myString);
}
public void restoreBtns() {
if(myBtns > 0) {
panel = (LinearLayout) findViewById(R.id.LinearLayout1);
btnArray = new ImageButton[myBtns];
for (int i = 0; i < myBtns; i++){
btnId++;
btnArray[i] = new ImageButton(this);
btnArray[i].setImageResource(R.drawable.ic_launcher);
btnArray[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btnArray[i].setId(btnId);
panel.addView(btnArray[i]);
}
}
}
public void add(View view) {
btnId++;
panel = (LinearLayout) findViewById(R.id.LinearLayout1);
ImageButton imgBtn = new ImageButton(this);
imgBtn.setImageResource(R.drawable.ic_launcher);
imgBtn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
imgBtn.setId(btnId);
panel.addView(imgBtn);
}
public void set(View view) {
textView.setText("Goodbye");
Log.d(TAG, "on set(), myString is " + myString);
}
}
# 1 楼答案
当执行onCreate()时,myBtns为0。由于if语句,restoreBtns()。因此,myBtns只有在使用后才会初始化
建议:将按钮移到onResume()
# 2 楼答案
这样试试