gpt4 book ai didi

android - editTexts 在旋转设备时改变它们的值

转载 作者:搜寻专家 更新时间:2023-11-01 08:06:47 25 4
gpt4 key购买 nike

背景

当您创建一个新的 android 项目时,我的应用程序架构与默认的“滑动 View ”非常相似。一项 Activity ,3 个 fragment ,您可以轻扫它们。它使用支持库。一切都是最新的。我正在测试的设备是运行 android 4.1.2 的 galaxy nexus支持库 r11,SDK 版本 min=14 target=16

问题

第二个 Fragment 包含一堆 EditText,其中包含从 sharedPreferences 读取的各种数值。首次创建 Activity 时,一切正常,EditView 都具有正确的值,但如果我将其中一个值修改为例如 555,然后旋转设备,所有 EditText 现在都显示 555!

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

详情

一个 Activity 包含一个 SectionsPagerAdapter、一个 ViewPager 和每个页面的几个 fragment 。

onViewCreated 方法的一个 fragment (ConfigurationFragment) 中,我使用 EditTextImageButton 动态创建行。

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

onViewCreated 方法:

public void onViewCreated(View view, Bundle savedInstanceState)
{
// populate ports list on view creation
ArrayList<String> listenPorts = mServerManagerThread.getListenPorts();
for (String port : listenPorts)
{
EditText v = ((EditText) addListenPortItem().getChildAt(0));
v.setText(port);
}

super.onViewCreated(view, savedInstanceState);
}

自然地,getListenPorts 方法每次被调用时(启动时和设备旋转时)都会返回相同的列表

addListenPortItem 的基本作用:

    // Instantiate a new "row" view.
final ViewGroup newView = (ViewGroup) LayoutInflater.from(viewGroup.getContext()).inflate(itemResource,
viewGroup, false);

// Set a click listener for the "X" button in the row that will remove
// the row.
newView.findViewById(R.id.delete_button).setOnClickListener(
new OnRemoveClickListener(mContainer, viewGroup, newView, emptyListTextResource));

viewGroup.addView(newView);

viewGroup 是一个 linearLayout,它将保存新创建的 View itemResource是下面的布局

一行的布局:

<?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>

有什么想法吗?

我已经盯着这个错误看了几个小时了,我真的不知道发生了什么......我开始怀疑 SDK 或支持库中的错误,但我从经验中知道错误最常出现在我的大脑中:)

最佳答案

我找到了解决方案:我将代码从 onViewCreated 移到 onViewStateRestored(..) 以便在状态恢复后用它们的值填充 EditText。

问题是所有的 EditText 都有相同的 id,所以在恢复状态时它搞砸了。

关于android - editTexts 在旋转设备时改变它们的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com