- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
序言:我正在使用 ActionBarSherlock,Target SDK 是 17 (Android 4.2),Min SDK 是 5 (Android 2.0)
情况:
我的应用程序中有一个 fragment ,它提供某种登录。它允许用户在设备上拥有多个用户帐户(因为 Android < 4.2 没有系统支持,我们的用户似乎由于设备共享而使用它)。
fragment 布局由一个 ListView 组成,在大横向上还有一个用于添加新帐户的按钮(否则通过可用的溢出菜单)。
ListView 附加到一个名为“AccountAdapter”的 BaseAdapter-Derivate,它从数据库中获取帐户并通过 layoutinflater 为每个帐户创建相应的 subview 。有 3 种可能性:用户提供登录名和密码/用户仅提供登录名/用户未提供任何内容。因此,对于这些情况,有 3 种不同的布局,其中通过 EditText-Elements 请求丢失的数据,并通过 TextView 显示存储的数据。此外,具有缺失数据的布局提供了一个用于存储缺失数据的复选框和一个提交按钮。如果提供了所有数据,则缺少提交按钮的 onclicklistener 将直接附加到帐户 Root View 。onclicklistener将输入的数据消息给网络代码类,修改适配器模式;之后,适配器仅显示所选条目,但带有“进度” View ,以将当前操作可视化给用户(“用户 XXX 正在登录,请稍候...”)。
这已经很好用了。
问题:
在方向改变时,所有输入的数据都会丢失。输入的登录数据、密码以及有关是否应存储登录数据的信息。
布局:
<!-- layout/main.xml -->
<?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"
android:orientation="horizontal" >
<FrameLayout
android:id="@id/main_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- layout-large-land/main.xml -->
<?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"
android:orientation="horizontal" >
<FrameLayout
android:id="@id/main_fragment_sidebar"
android:layout_width="@dimen/main_sidebar_width"
android:layout_height="match_parent" />
<FrameLayout
android:id="@id/main_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- layout/fragment_login.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@id/fragment_login_accountlist"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
<!-- layout-large-land/fragment_login.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@id/fragment_login_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="@string/string_fragment_login" />
<ListView
android:id="@id/fragment_login_accountlist"
android:layout_width="@dimen/fragment_login_accountlist_width"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" >
</ListView>
</RelativeLayout>
<!-- layout/view_login_account_new.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />
<EditText
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
android:hint="@string/string_view_login_account_username_hint"
android:inputType="text" >
<requestFocus />
</EditText>
<EditText
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:hint="@string/string_view_login_account_password_hint"
android:inputType="textPassword" />
<CheckBox
android:id="@id/view_login_account_storecredentials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_password"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:text="@string/string_view_login_account_storecredentials_text" />
<Button
android:id="@id/view_login_account_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_storecredentials"
android:text="@string/string_view_login_account_submit_text" />
</RelativeLayout>
<!-- layout/view_login_account_progress.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />
<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
>
</TextView>
<TextView
android:id="@id/view_login_account_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:text="@string/string_view_login_account_progress_text" />
</RelativeLayout>
<!-- layout/view_login_account_stored_password.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />
<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
>
</TextView>
<TextView
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:text="@string/string_view_login_account_password_text"
/>
</RelativeLayout>
<!-- layout/view_login_account_stored_username.xml -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@id/view_login_account_profileimage"
android:layout_width="@dimen/view_login_account_profileimage_width"
android:layout_height="@dimen/view_login_account_profileimage_height"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/string_view_login_account_profileimage_contentdescription"
android:scaleType="fitCenter"
android:src="@drawable/img_kb" />
<TextView
android:id="@id/view_login_account_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:ems="10"
android:hint="@string/string_view_login_account_username_hint" >
<requestFocus />
</TextView>
<EditText
android:id="@id/view_login_account_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/view_login_account_username"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_username"
android:ems="10"
android:hint="@string/string_view_login_account_password_hint"
android:inputType="textPassword" />
<CheckBox
android:id="@id/view_login_account_storecredentials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_password"
android:layout_toRightOf="@id/view_login_account_profileimage"
android:text="@string/string_view_login_account_storecredentials_text" />
<Button
android:id="@id/view_login_account_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/view_login_account_storecredentials"
android:text="@string/string_view_login_account_submit_text" />
</RelativeLayout>
代码:
代码都没有实现 onSaveInstanceState 和 onConfigurationChange。(整个报价太长恕我直言,> 1.000 行代码)
public class MessengerActivity extends SherlockFragmentActivity {
// -------------------------------------------------------------------------
FrameLayout fragmentSidebar = null;
FrameLayout fragmentContent = null;
Content content = null;
// -------------------------------------------------------------------------
boolean hasSidebar = false;
// -------------------------------------------------------------------------
public void onCreate(Bundle savedInstanceState) {
// ---------------------------------------------------------------------
super.onCreate(savedInstanceState);
// ---------------------------------------------------------------------
content = Content.getInstance(this);
// ---------------------------------------------------------------------
setContentView(R.layout.main);
// ---------------------------------------------------------------------
captureFragmentViews();
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
if (savedInstanceState == null) {
// -----------------------------------------------------------------
gotoLogin();
// -----------------------------------------------------------------
}
else {
// -----------------------------------------------------------------
// -----------------------------------------------------------------
}
// ---------------------------------------------------------------------
}
// -------------------------------------------------------------------------
// Disabled through android manifest at the moment
@Override
public void onConfigurationChanged(Configuration newConfig) {
// ---------------------------------------------------------------------
super.onConfigurationChanged(newConfig);
// ---------------------------------------------------------------------
Log.d(getClass().getSimpleName(), "onConfigurationChanged");
// ---------------------------------------------------------------------
}
// -------------------------------------------------------------------------
public void captureFragmentViews() {
// ---------------------------------------------------------------------
fragmentSidebar = (FrameLayout) findViewById(R.id.main_fragment_sidebar);
fragmentContent = (FrameLayout) findViewById(R.id.main_fragment_content);
// ---------------------------------------------------------------------
if ((fragmentSidebar != null) && (fragmentContent != null)) {
hasSidebar = true;
}
else {
hasSidebar = false;
}
// ---------------------------------------------------------------------
}
// -------------------------------------------------------------------------
public void gotoLogin() {
// ---------------------------------------------------------------------
Fragment fragment = SherlockFragment.instantiate(this,
LoginFragment.class.getName());
// ---------------------------------------------------------------------
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (hasSidebar) {
ft.add(R.id.main_fragment_content, fragment);
fragmentSidebar.setVisibility(View.GONE);
}
else {
ft.add(R.id.main_fragment_content, fragment);
}
// ---------------------------------------------------------------------
ft.commit();
getSupportFragmentManager().executePendingTransactions();
// ---------------------------------------------------------------------
}
// -------------------------------------------------------------------------
public void gotoSignup() {
// TODO Auto-generated method stub
}
// -------------------------------------------------------------------------
public void gotoContactList(int filterId) {
// TODO Auto-generated method stub
}
// -------------------------------------------------------------------------
public void gotoConversation(int userId) {
// TODO Auto-generated method stub
}
// -------------------------------------------------------------------------
public void gotoOnlineStatusList(int categoryId) {
// TODO Auto-generated method stub
}
// -------------------------------------------------------------------------
public void gotoSettings(int categoryId) {
// TODO Auto-generated method stub
}
// -------------------------------------------------------------------------
}
我检查是否在主 Activity 中设置了 savedInstanceState,因此我的 Activity 在 fragment 重建方面已经“准备好”。
Fragment 在创建适配器并将其附加到 ListView 之前检查适配器是否已经存在。但是:据我所知,即使“重新创建”的 fragment 使用相同的适配器,“默认情况下”所有 getViews() 都会被调用,因此会创建一个具有“重置”内容的新 View 实例。
AccountAdapter 从数据库中获取专用的“Account”——具有用户 ID、用户名、密码的对象。此外,可以扩展“帐户”以保存其他数据,例如缓存 View 。
我的想法是像这样实现一个 getView:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// ---------------------------------------------------------------------
final Account account = (Account) getItem(position);
View view = null;
// ---------------------------------------------------------------------
if (account == null) {
return view;
}
// ---------------------------------------------------------------------
if (account.view != null) {
return account.view;
}
// ---------------------------------------------------------------------
[...]
}
但后来我注意到,AccountAdapter 没有在重新创建后存活下来,Android 重新实例化了 LoginFragment 类。
我需要什么:
最佳答案
如果每次调用 Activity
的 onCreate()
方法时添加一个 Fragment
,您的代码并不清楚。
您应该仅在首次创建 Activity
时添加一个 Fragment
或第一个 Fragment
。
if(savedInstanceState==null){
addFragment();
}
如果这不是 null
,您的 Activity
将被重新创建,并且它还会重新添加您之前的 Fragments
。 Evan 如果您在 backstack
中有更多的 Fragments
,它们将全部放回您的 Activity
中。
要将数据保留在 fragment 中,您应该在 Fragments
onCreate()
方法上使用 setRetainInstance(true);
,或者使用 onSaveInstanceState(Bundle bundle)
来保存特定数据。
关于android - 如何保留 fragment ListView 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14623012/
我有一个像这样的 fragment 栈 F1 -> F2 -> F3 -> F4 -> F5 现在我需要删除 F2、F3、F4 fragment 。 我需要如果我从 F5 fragment 按下后退按
我需要帮助来理解以下场景的工作原理以及如何实现结果。 我有一个名为 ShoppingCart 的类。它有一个名为 addItemsToShoppingCartFromPreviousOrder 的方法
我有一个包含 ViewPager 的 fragment 。这个 ViewPager 显然是由其他 Fragments 填充的。 我的问题是,ViewPager 中的 Fragment 是否有任何方法(
所以我正在实现一个 FragmentActivity 并尝试添加一个 fragment ,但是我遇到了多个问题。我以前做过这个,实际上我使用的代码与上一个项目(它工作的地方)相同,但由于某种原因它在这
Closed. This question needs details or clarity。它当前不接受答案。
我想将 Android X fragment (androidx.fragment.app.Fragment) 转换为 Android native fragment (android.app.Fra
假设我有一个包含 10 列文本类型 (20) 的 SQLite 表。 ListFragment 将从数据库中提取 4 列并使用 SimpleCursorAdapter 显示在列表中。 选择后,List
我有一个对话框 fragment ,我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是: fragment 与 fragment 管理器无关。 我也尝试过
我想在 View 分页器更改为 fragment 时刷新该 fragment 。 package com.mcivisoft.rcbeam; import android.os.Bundle; imp
我有一个名为的 Activity MainActivity 我在容器 R.id.mainContainer 中添加了 fragment “BenefitFragment”。 在 BenefitFrag
所以我有这个 ClientListView,效果很好,可以显示客户,我可以单击一个客户并在右侧获取他们的详细信息(在我的第二个 fragment 中)。由此处的布局定义: 这很好用,但后来我
我试过这段代码,但点击第一个 fragment 中的按钮并没有改变第二个 fragment 中的字符串值。 这是第一个 fragment 的 kotlin 文件。它有两个按钮,点击它们可以更改字符串值
我有以下情况:我打开 fragment A 和目标,通过按钮的单击事件转到 fragment B。当我在 fragment B 中并点击后退按钮(为了返回 fragment A) 我想将一些参数传递给
我制作了一个 NavigationDrawer fragment ,其中包含 Home、Settings、Feedback 等项目。 home 项在点击 home 时应该打开,home 是在应用程序启
我正在一个接一个地替换 2 个 fragment ,两个 fragment 都有不同的选项菜单。当我替换第二个 fragment 时,它也显示第一个 fragment 的菜单。 setHasOptio
我有问题: android.app.Fragment$InstantiationException: Unable to instantiate fragment ${packageName}.${a
我正在研究 fragment 转换。当我用第二个 fragment 替换第一个 fragment 时,它出现在第一个 fragment 的下方。我希望它移动到第一个 fragment 之上。我该怎么做
我在抽屉导航里总共有 12 个 fragment 。每个 fragment 都有 volley 方法。每个 fragment 都显示自己的 Volley 响应,除了 position = 1 和 po
我在我的 Activity 中使用了两个 fragment 。最初我将向 Activity 添加一个 fragment 。然后在第一个 fragment 中使用监听器我想用第二个 fragment 替
我正在实现一个“fragments-101”程序,当相应的按钮被点击时我会替换一个 fragment 。然而,下面的事情发生了: 为什么会这样?为什么初始 fragment 没有被完全替换?MainA
我是一名优秀的程序员,十分优秀!