Android 旋转设备时更改其值

Android 旋转设备时更改其值,android,layout,android-activity,android-fragments,android-edittext,Android,Layout,Android Activity,Android Fragments,Android Edittext,上下文 我的应用程序架构非常类似于创建新android项目时的默认滑动视图。 一个活动,3个片段,你可以在其中滑动。它使用支持库。 一切都是最新的。 我正在测试的设备是运行安卓4.1.2的galaxy nexus 支持库r11和SDK版本min=14 target=16 问题 第二个片段包含一组EditText,其中包含从SharedReference读取的各种数值。当第一次创建活动时,一切正常EditView都有正确的值,但是如果我将其中一个值修改为,例如555,然后旋转设备,所有EditTe

上下文

我的应用程序架构非常类似于创建新android项目时的默认滑动视图。 一个活动,3个片段,你可以在其中滑动。它使用支持库。 一切都是最新的。 我正在测试的设备是运行安卓4.1.2的galaxy nexus 支持库r11和SDK版本min=14 target=16

问题

第二个片段包含一组EditText,其中包含从SharedReference读取的各种数值。当第一次创建活动时,一切正常EditView都有正确的值,但是如果我将其中一个值修改为,例如555,然后旋转设备,所有EditText现在都显示555

在整个程序中只有一个setText,它将在本帖后面显示,我尝试删除它,正如启动活动时预期的那样,所有EditText显示默认值666,我修改一个并旋转设备,它们都显示新值

细节

一个活动,每个页面有一个SectionsPagerAdapter、一个ViewPager和几个片段

在onViewCreated方法中的一个片段ConfigurationFragment中,我使用和EditText以及ImageButton动态创建行

这些行实际上是在一个布局xml文件中,我为要添加的每一行充气,然后我获取editText并调用setText将其值设置为应该的值

onViewCreated方法:

视图组是一个线性布局,它将保存新创建的视图 itemResource的布局如下所示

一条线路的布局:

有什么想法吗


我已经盯着这个虫子看了几个小时了,我真的不知道发生了什么。。。我开始怀疑SDK或支持库中有一个bug,但根据经验,我知道这个bug最常出现在我的大脑中:

这不是bug,所以不要担心。问题是,如果旋转屏幕,活动和片段将被重新创建。onCreateView会再次被调用,这会把事情搞混,因此你会有这样一种奇怪的行为。您可以通过覆盖以下thwo方法来解决此问题:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

这不是一个错误,所以不要担心。问题是,如果旋转屏幕,活动和片段将被重新创建。onCreateView会再次被调用,这会把事情搞混,因此你会有这样一种奇怪的行为。您可以通过覆盖以下thwo方法来解决此问题:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

我找到了解决方案:我将代码从onViewCreated移动到onViewStateRestored。。因此,在状态恢复后,用编辑文本的值填充编辑文本


问题是所有的EditText都有相同的id,因此在恢复状态时会把它搞砸。

我找到了解决方案:我将代码从onViewCreated移动到onViewStateRestored。。因此,在状态恢复后,用编辑文本的值填充编辑文本


问题是,所有EditText都具有相同的id,因此在恢复状态时会将其弄糟。

我知道onCreateView再次被调用,代码也会使用EditText重新添加行并在onSaveInstanceState中设置它们的值。您可以保存值。因此,如果屏幕旋转,onCreateView将被调用,onCreateView将一个Bundle作为参数,这恰好是RestoreInstanceState传递的Bundle。请参考此问题:我知道这一点,但我看不出有什么帮助,因为这些值不是问题所在,我通过调用GetListenPort获得它们没有帮助。实际的根本原因如下:使用tag而不是id作为解决此问题或错误的方法。我知道一旦再次调用CreateView,代码也会使用EditText重新添加行并在onSaveInstanceState中设置它们的值。您可以保存值。因此,如果屏幕旋转,onCreateView将被调用,onCreateView将一个Bundle作为参数,这恰好是RestoreInstanceState传递的Bundle。请参考此问题:我知道这一点,但我看不出有什么帮助,因为这些值不是问题所在,我通过调用GetListenPort获得它们没有帮助。实际的根本原因如下:使用标签而不是id作为解决此问题或bug的方法。请将此问题标记为已解决,并进一步解释。因为我也面临着同样的问题,但尽管你说你已经解决了,但却找不到合适的解决方案……@chavan我恐怕不太记得这个问题,但我想问题是我在相同的布局下充气了n倍,所以所有的EditText都有相同的id android:id=@+id/editPort。旋转设备时,将重新创建视图,并使用ID将值放回原位。。。我想是吧。但它们都有相同的,所以不起作用。当时的解决方案是在之后重写该值,您可以在onViewStateRestored中这样做。更清楚吗?是的,我也有这个问题,因为我
多次包含布局,导致同一视图id多次出现。您的答案有助于找到原因。设备旋转时设置为相等的所有EditText值。我用myView.setIdView.generateViewId修复了这个问题;创建时,如上所示。。感觉像是一个解决办法。请您将这个问题标记为已解决,并进一步解释一下。因为我也面临着同样的问题,但尽管你说你已经解决了,但却找不到合适的解决方案……@chavan我恐怕不太记得这个问题,但我想问题是我在相同的布局下充气了n倍,所以所有的EditText都有相同的id android:id=@+id/editPort。旋转设备时,将重新创建视图,并使用ID将值放回原位。。。我想是吧。但它们都有相同的,所以不起作用。当时的解决方案是在之后重写该值,您可以在onViewStateRestored中这样做。是否更清楚?是的,我也有这个问题,因为多次包含布局导致同一视图id多次出现。您的回答有助于找到原因。设备旋转时设置为相等的所有EditText值。我用myView.setIdView.generateViewId修复了这个问题;创建时,如上所示。。感觉像是一个解决办法。
<?xml version="1.0" encoding="utf-8"?>
<!--
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?android:listPreferredItemHeightSmall"
    android:layout_marginTop="8dp"
    android:divider="?android:dividerVertical"
    android:dividerPadding="8dp"
    android:gravity="right"
    android:orientation="horizontal"
    android:showDividers="middle" >

    <EditText
        android:id="@+id/editPort"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="number"
        android:text="666" >
    </EditText>

    <ImageButton
        android:id="@+id/delete_button"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/action_remove_item"
        android:src="@drawable/content_remove" />
</LinearLayout>
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}