Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在onStart和onResume之间更改具有相同id的所有TextView的android文本_Android - Fatal编程技术网

在onStart和onResume之间更改具有相同id的所有TextView的android文本

在onStart和onResume之间更改具有相同id的所有TextView的android文本,android,Android,我正在实现一个显示项目列表的视图,允许用户通过拖放对项目进行排序。在我尝试旋转屏幕之前,这一切都很好。然后,所有项目的文本将更改为onStart和onResume(或在super.onResume中)之间的最后一个项目的文本 我已将代码简化为以下内容,但仍然会产生这种奇怪的行为: public class MainActivity extends Activity { LinearLayout root; @Override protected void onCrea

我正在实现一个显示项目列表的视图,允许用户通过拖放对项目进行排序。在我尝试旋转屏幕之前,这一切都很好。然后,所有项目的文本将更改为onStart和onResume(或在super.onResume中)之间的最后一个项目的文本

我已将代码简化为以下内容,但仍然会产生这种奇怪的行为:

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>