在onStart和onResume之间更改具有相同id的所有TextView的android文本
我正在实现一个显示项目列表的视图,允许用户通过拖放对项目进行排序。在我尝试旋转屏幕之前,这一切都很好。然后,所有项目的文本将更改为onStart和onResume(或在super.onResume中)之间的最后一个项目的文本 我已将代码简化为以下内容,但仍然会产生这种奇怪的行为:在onStart和onResume之间更改具有相同id的所有TextView的android文本,android,Android,我正在实现一个显示项目列表的视图,允许用户通过拖放对项目进行排序。在我尝试旋转屏幕之前,这一切都很好。然后,所有项目的文本将更改为onStart和onResume(或在super.onResume中)之间的最后一个项目的文本 我已将代码简化为以下内容,但仍然会产生这种奇怪的行为: public class MainActivity extends Activity { LinearLayout root; @Override protected void onCrea
public class MainActivity extends Activity {
LinearLayout root;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(" ### on create ### ");
if (root!=null) {
return;
}
System.out.println(" !!! root is null !!!");
root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
for (int id=0; id<6; id++) {
View out = getLayoutInflater().inflate(R.layout.list_item, null);
TextView tv = (TextView) out.findViewById(R.id.list_item_text);
//TextView tv = (TextView) ((LinearLayout)out).getChildAt(1); // for this special list_item layout this line is equivalent to the above
tv.setText("test item "+id);
System.out.println(tv.getText());
root.addView(out);
}
setContentView(root);
}
@Override
protected void onStart() {
super.onStart();
System.out.println("on start");
System.out.println(((TextView) root.getChildAt(1).findViewById(R.id.list_item_text)).getText());
}
@Override
protected void onResume() {
super.onResume();
System.out.println("on resume");
System.out.println(((TextView) root.getChildAt(1).findViewById(R.id.list_item_text)).getText());
}
}
公共类MainActivity扩展活动{
线状根;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
System.out.println(“#####on create####”);
if(root!=null){
返回;
}
System.out.println(!!!根为null!!!”;
根=新的线性布局(本);
根。设置方向(线性布局。垂直);
对于(int id=0;id而言,要点是-每次用户旋转设备时都会重新创建任何活动。因此,您应该正确处理重新创建过程。有一种activity
方法,在该方法中,您可以将任何重要的值存储在捆绑包中,然后在onCreate
方法中使用(因为有一个Bundle类型的参数)
下面是一个小例子:
public class MainActivity extends Activity {
private TextView test1;
private TextView test2;
private final String KEY_1 = "key_1";
private final String KEY_2 = "key_2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test1 = (TextView) findViewById(R.id.test1);
test2 = (TextView) findViewById(R.id.test2);
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_1)) {
test1.setText(savedInstanceState.getString(KEY_1));
}
if (savedInstanceState.containsKey(KEY_2)) {
test2.setText(savedInstanceState.getString(KEY_2));
}
}
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (Math.random() < 0.5) {
test1.append("1");
} else {
test2.append("2");
}
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_1, test1.getText().toString());
outState.putString(KEY_2, test2.getText().toString());
}
}
公共类MainActivity扩展活动{
私有文本视图test1;
私有文本视图测试2;
私有最终字符串KEY_1=“KEY_1”;
私有最终字符串KEY_2=“KEY_2”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test1=(TextView)findViewById(R.id.test1);
test2=(TextView)findViewById(R.id.test2);
如果(savedInstanceState!=null){
if(savedInstanceState.containsKey(键1)){
test1.setText(savedInstanceState.getString(KEY_1));
}
if(保存状态状态containsKey(键2)){
test2.setText(savedInstanceState.getString(键2));
}
}
findViewById(R.id.button1).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(Math.random()<0.5){
测试1.附加(“1”);
}否则{
测试2.附加(“2”);
}
}
});
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
putString(KEY_1,test1.getText().toString());
putString(KEY_2,test2.getText().toString());
}
}
还有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">
<TextView
android:id="@+id/test1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text1" >
</TextView>
<TextView
android:id="@+id/test2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text2" >
</TextView>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
这解释了root为null的原因。但是我不认为在onSaveInstanceState中保存视图的文本并在onCreate中应用它们对我有什么帮助,因为问题是在onCreate之后视图中的文本会被覆盖。@jakun您必须使用包中存储的数据重新填充视图容器,可能您应该这样做首先清空它。因此,如果Bundle
不是空的,并且包含文本数据-使用它以旋转之前的状态重新创建文本视图。否则,填充视图就像它是应用程序的第一个启动一样。我在super.onCreate()之后直接添加了if(savedInstanceState!=null)savedInstanceState.clear();
(savedInstanceState);
这确实解决了问题。非常感谢!稍后将根据数据库填充此列表。
<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">
<TextView
android:id="@+id/test1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text1" >
</TextView>
<TextView
android:id="@+id/test2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text2" >
</TextView>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>