什么究竟,当你调用发生setRetainInstance(true)在Fragment?文档几乎不存在,这似乎是一个非常重要的功能.具体来说,我想知道这个序列(我编造的)有多少是真的:
- 用户旋转设备.
- 该片段从分离
Activity和Fragment.onDetach()被调用.- 活动被摧毁;
Activity.onDestroy()叫做.- 所述
Activityjava对象被删除(如果可能,通过GC).Activity创建一个新的java对象; 它的构造函数,并被onCreate()调用.- 在
Activity.onCreate()我们要么setContentView(...)设置包含片段的布局,要么我们FragmentTransaction用来添加片段.- 我真的不确定这一点,但我认为android很聪明,可以找到旧的片段,并呼吁
Fragment.onAttach()将它重新连接到新的ActivityActivity.onResume()调用下一个(或之前?谁知道?).
那是对的吗?即使我FragmentTransaction.add(new MyFragment(), ...)第一次明确使用,Android是否足够智能找到旧片段?如果是这样,我如何避免添加另一个片段onCreate()?我需要做这样的事吗?:
if (getSupportFragmentManager().findFragmentByTag("foo") == null)
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(new FooFragment(), "foo").commit();
}
Run Code Online (Sandbox Code Playgroud) 我不太了解这个片段生命周期业务.
我的应用程序的"查看详细信息"部分有一个非常标准的3页水平滑块视图寻呼机布局.我在三个中间页面上启动了我的应用程序.我的FragmentActivity将页面设置为第1页.
mPager.setCurrentItem(1); //default to center page, current data view fragment
Run Code Online (Sandbox Code Playgroud)
我一直在使用FragmentStatePagerAdapter,因为使用FragmentPagerAdapter有时会崩溃我的应用程序,例如从暂停状态返回时,这是解决此问题的最快方法.似乎工作,但我怀疑国家方面可能是我的问题的原因,也许.
所以起初我以为我会让每个片段完成从休息服务获取数据然后在列表中显示它的工作,但我不再那么肯定了.
我尝试运行一个唯一的异步任务来获取onCreateView事件中每个片段中的数据.然后在阅读了片段生命周期的更多内容之后,我切换到onCreate,注意到onCreateView被大量调用,这反过来又成了一个贪婪的应用程序,经常通过网络请求数据.
切换到onCreate没有改变任何东西.对于2个相邻的片段,OnCreate的调用仍然与onCreateView一样多.
奇怪的是,我设置为第一个在Fragment Activity中显示的片段只获得一次调用的onCreate.
这里感觉不舒服.
现在我想我应该让父片段活动声明并调用所有异步任务来获取我需要在片段中显示的数据.在父片段活动拥有的对象中设置异步调用的结果,然后让片段使用父级包含的对象来创建列表视图等.
但是,如果父活动启动的异步任务在调用每个片段onCreateView之前没有完成,并且父级包含的对象尚未准备就绪.....
签名,困惑和沮丧
android android-fragments android-viewpager android-fragmentactivity
EDIT3:似乎只有API17及以上才能让ViewPager与ChildFragmentManager一起正常工作.........
我正在尝试添加一个ViewPager我的DialogFragment:
public class FirstLaunchDialogFragment extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_Sherlock_Light_Dialog);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View v = getActivity().getLayoutInflater().inflate(
R.layout.fragment_dialog_first_launch, null);
ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager);
viewPager.setAdapter(new FirstLaunchFragmentsAdapter(getChildFragmentManager()));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v).setInverseBackgroundForced(true);
return builder.create();
}
}
Run Code Online (Sandbox Code Playgroud)
由于某些原因,它会崩溃说:
04-06 00:00:49.600: E/AndroidRuntime(3734): java.lang.IllegalStateException: Fragment does not have a view
04-06 00:00:49.600: E/AndroidRuntime(3734): at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425)
04-06 00:00:49.600: E/AndroidRuntime(3734): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
04-06 00:00:49.600: E/AndroidRuntime(3734): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
04-06 00:00:49.600: E/AndroidRuntime(3734): at …Run Code Online (Sandbox Code Playgroud) 我正在使用来自流行病回答的信息在我的应用中创建标签
我创建了处理标签的主类,这个类extends TabActivity并创建了标签:
Resources res = getResources();
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, stackA.class);
spec = tabHost.newTabSpec("tab1").setIndicator("Tab 1",
res.getDrawable(android.R.drawable.ic_menu_search))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, stackB.class);
spec = tabHost.newTabSpec("tab2").setIndicator("Tab 2",
res.getDrawable(android.R.drawable.ic_menu_search))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
Run Code Online (Sandbox Code Playgroud)
然后为每个选项卡创建FragmentActivity,这样就可以在每个选项卡中创建堆栈.我的片段已创建:
protected void navigateTo(Fragment newFragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content, newFragment);
ft.addToBackStack(null);
ft.commit();
}
public class fragmentA extends Fragment{
private LinearLayout ll;
private FragmentActivity fa;
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud)