我正在尝试用活动做一些事情,但是在一个片段中。 我所做的是使用活动:
旋转设备时,首先停止活动重启
android:configChanges="keyboardHidden|orientation|screenSize"
在我的活动中添加:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}
所以让活动不重启,而是重新加载main.xml,使用layout-land
现在我有一个显示viewpager的活动,其中包含三个片段。 一切正常。旋转的检测在片段中
public class FRG_map_web extends Fragment {
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("myLogs", "Rotation");
}
问题是该片段不使用setContentView(R.layout.main);这是代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frg.myFragment, null);
我试图使用:
LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.frg.myFragment, null);
...
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.frg.myFragment, null);
...
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
view = inflater.inflate(R.layout.frg.myFragment, null);
...
LayoutInflater li = LayoutInflater.from(context);
和不同的方式,但总是没有成功 我无法正常充气。
有谁能告诉我我该怎么做?
提前致谢,我感谢您的帮助
此致
答案 0 :(得分:25)
如果我理解正确,您不希望片段在每次旋转时重新加载。相反,您希望重新发布视图并使用您已有的信息更新它们。
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Get a layout inflater (inflater from getActivity() or getSupportActivity() works as well)
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View newView = inflater.inflate(R.layout.frg.myFragment, null);
// This just inflates the view but doesn't add it to any thing.
// You need to add it to the root view of the fragment
ViewGroup rootView = (ViewGroup) getView();
// Remove all the existing views from the root view.
// This is also a good place to recycle any resources you won't need anymore
rootView.removeAllViews();
rootView.addView(newView);
// Viola, you have the new view setup
}
根据文档(getView()),getView()返回从onCreateView()返回的相同视图,但它没有。它实际上返回你在onCreateView()中返回的视图的父级,这正是你需要的。 getView()将返回NoSaveStateFrameLayout的实例,该实例专门用于Fragments作为其根视图。
希望这有帮助。
答案 1 :(得分:14)
您是否考虑过保留片段实例?请参阅Fragment#setRetainInstance。
允许重新创建Activity(不指定android:configChanges),但保留片段实例的方向更改。如果在Fragment#onCreate中发生所有繁重的工作,这应该可以正常工作。由于没有重新创建片段,因此不会再次调用onCreate()。
答案 2 :(得分:2)
我可以通过在onConfigurationChanged:
中重新附加片段来实现 @Override
public void onConfigurationChanged(Configuration newConfig)
{
getActivity().detachFragment(this);
super.onConfigurationChanged(newConfig);
....
getActivity().attachFragment(this);
}
请记住,通过分离和附加您的片段,您将只使用其视图。但片段状态在片段管理器中“保存”。
答案 3 :(得分:0)
也许你可以尝试使用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frg.myFragment, container, false);
}
。在任何情况下,片段仍然必须被销毁和重新创建,为什么不让Android通过重新启动活动自动处理它?如果有任何数据要保留,您可以将其保存在onSavedInstanceState()
中。 Android中不建议设置android:configChanges="keyboardHidden|orientation|screenSize"
。
答案 4 :(得分:0)
您可以尝试分离 e 附加片段:
@Override
public void onConfigurationChanged(Configuration newConfig) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
fragmentManager.beginTransaction().detach(this).commitAllowingStateLoss();
}
super.onConfigurationChanged(newConfig);
if (fragmentManager != null) {
fragmentManager.beginTransaction().attach(this).commitAllowingStateLoss();
}
}