我写Android应用程序已经很久了,但现在我面临着一个我从未想过的问题。它是关于与配置更改相关的Activitys
和Fragments
的android生命周期。为此,我创建了一个带有以下必要代码的小应用程序:
public class MainActivity extends FragmentActivity {
private final String TAG = "TestFragment";
private TestFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
fragment = (TestFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new TestFragment();
fm.beginTransaction().add(R.id.fragment_container, fragment, TAG).commit();
}
}
}
这是我的TestFragment
代码。请注意,我正在调用setRetainInstance(true)
onCreate
方法中使用code>,以便在配置更改后不会重新创建片段。
public class TestFragment extends Fragment implements View.OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater li, ViewGroup parent, Bundle bundle) {
View rootView = li.inflate(R.layout.fragment_test, parent, false);
Button button = (Button) rootView.findViewById(R.id.toggleButton);
button.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
Button button = (Button) v;
String enable = getString(R.string.enable);
if(button.getText().toString().equals(enable)) {
button.setText(getString(R.string.disable));
} else {
button.setText(enable);
}
}
}
这是我的片段使用的布局:
<LinearLayout
...>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/toggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enable"/>
</LinearLayout>
我的问题是,如果我旋转设备的文本按钮
改变回默认值。当然,片段的视图是新创建和膨胀的,但是保存的视图实例应该被恢复。我也有一个EditText
在我的布局和文本和其他属性仍然旋转后。那么,为什么按钮在默认情况下不能从Bundle
中还原呢?我在开发者网站上读到过:
默认情况下,系统使用Bundle实例状态保存有关活动布局中每个视图对象的信息(例如输入到EditText对象中的文本值)。因此,如果您的活动实例被销毁并重新创建,则布局的状态将恢复到其以前的状态,而不需要任何代码。
在过去的几天里,我也读了很多答案,但我不知道它们有多真实。请不要在android:configChanges=
这是非常糟糕的做法。我希望有人能让我明白我的无知。
根据文档,视图应保持其状态,而不使用setRetainInstance(true)
。尝试将其从onCreate
中删除,这将强制在屏幕旋转时重新创建片段,因此它的所有视图都应在旋转前保存,并在旋转后恢复。
TextView
默认情况下,子类不保存其文本。您需要在布局中启用freezesText=“true”
,或在运行时启用setFreezesText(true)
,以便保存其状态。
您应该将片段的状态保存在onSaveInstanceState(Bundle outState)
中,并在onViewCreated(View,Bundle SavedState)
方法中恢复它。这样,您将最终获得与配置更改之前一样的用户界面。
问题内容: 我想将自己更改为我尝试过的内容,但无法将我的活动更改为片段。有人可以告诉我该怎么做吗?在哪里编辑我是Android上的新手。请告诉我和在此先感谢 这是我的活动: 问题答案: 只要了解一些步骤,您就可以现在和将来轻松地将Activity转换为Fragment ..: 首先,不要扩展,只要扩展.. 例如: 然后覆盖.. 然后通过LayoutInflater扩展布局,并分配给进一步用于子视图
这个项目是可以在Android Studio中找到的Master/Detail流模板的扩展。不同之处在于,这个应用程序使用一个活动和一个管理三个片段的ViewPager。第三个片段是Master(list)片段,其中包含一个可单击的Recyview。当单击列表项时,它会用子(细节)片段切换该片段。 在项目工作时,我希望避免在清单中使用。我该怎么做? baseFragment.java 接口:bri
我需要创建一个“滑动活动”,当用户滑动它时它会滑动。当用户向左“滑动”时,活动应该向左滑动,新的活动会从右侧来到屏幕上。你不能把它放在中间。同样的事情发生在雅虎邮件应用程序中。你可以在阅读邮件时看到这个,向左滑动邮件移动到下一封邮件。就像下面一样。 在图中,您可以看到下一封邮件(标题为“谢谢”)正在从侧面打开。在我的例子中,它们是两种不同的活动。我们还建议在当前活动的右侧显示下一个活动的一小部分(
问题内容: 我要在我的下一个Android项目中使用Retrofit 2.1.0。我想使用设计模式,因此为每个REST调用创建单独的类,即 IBalanceService.java BalanceRestClient.java BalanceActivity.java 如何通过onResponse()更新活动/片段中的UI? 附加信息: 最小SDK:19个 目标SDK:23个 使用OkHttp和g
我现在还在下面提供了一个示例。 我正在使用一个大型应用程序,它将序列化对象(实现可序列化,而不是可执行)从客户机发送到服务器。不幸的是,我们现在有一种情况,即现有字段完全改变了类型,这破坏了序列化。 谢谢你的建议。 5月20日更新-以下示例源--TestData中的字段“number”从旧版本中的“int”变为新版本中的“long”。注新版本的TestData中没有调用readObject(),因
我这么问的原因是因为我多年来一直在专门使用活动,Facebook SDK和Google Maps 2.0迫使我使用片段,现在我想知道与其他实现相比,它们是否本质上“更好”。 如果这个“不具建设性”或“过于开放”,那么答案显然是“不”。但是如果有一些谷歌开发者的文档或博客关于这个确切的主题,那么我想知道它