Articles of android fragments

DialogFrag#show()来自片段抛出“IllegalStateException:onSaveInstanceState后无法执行此操作”

为了清楚起见,我已经阅读了关于“IllegalStateException:在onSaveInstanceState之后无法执行此操作”的十几个SO问题,我已经阅读了Alex Lockwood的博客文章http://www.androiddesignpatterns.com/2013/08/片段事务提交状态-loss.html 所以我不是盲目地问这个。 我有一个非常简单的用例案例, 不涉及AsyncTask或任何后台处理。 我有一个包含按钮的片段。 在按钮的onClickListener上,我创建了一个DialogFragment并显示它。 public final class OverviewFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.overview_fragment, container, false); startNewGameButton = (Button) view.findViewById(R.id.buttonNewGame); startNewGameButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final NewGameFragment dialogFrag = NewGameFragment.create(getApplication()); dialogFrag.show(getFragmentManager(), NewGameFragment.FRAGMENT_TAG); } }); } [NewGameFragment] […]

Android Fragment在onCreateView()中被赋予一个空容器

我试图以非常简单的方式使用Android片段,类似于Android开发者网站上的教程。 我有一个Activity(MediaInfoActivity),代码如下: public class MediaInfoActivity extends FragmentActivity { private final String TAG = “MediaInfoActivity”; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate()”); setContentView(R.layout.media_info_activity_layout); } } 以下是media_info_activity_layout.xml文件的代码: 最后这里是MediaInfoFragment的代码: public class MediaInfoFragment extends Fragment { private final static String TAG = “MediaInfoFragment”; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate()”); } @Override public View onCreateView(LayoutInflater […]

下载平移Android片段转换

我正在使用Android Fragments。 我想达到以下效果。 我有2个碎片细节和一个主体。 在按钮上单击我希望细节面板向下滑动并平移主体的一部分。 详细信息面板未在活动的xml布局中声明。 它是动态添加的。 当用户完成时,细节面板也可以被解雇。 我find了一个我想要做的事情的例子。 当您在Xoom上以纵向模式使用时,Gmail中的Gmail应用程序会执行此操作。 一直导航到一封电子邮件,使其占据整个屏幕。 按后退按钮,注意右侧的电子邮件正文平移,为电子邮件消息列表腾出空间。

片段没有出现

我有一个问题,我可以创建一个片段,它的视图似乎被创建,但它没有显示。 片段本身被创建,内部的任何代码都没有问题,但它只是在某处看不见。 后退按钮也可以很好地与它交互(它“关闭”它),它只是没有物理地显示在屏幕上(只显示主要布局)。 从我的FragmentActivity: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_view); // some logic here that sets a button listener that calls openAddNamePane() when pressed } public void openAddNamePane(){ AddNamePane addNamePane = new AddNamePane(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.layout_root, addNamePane, “AddnamePane”); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } 这是首次显示的视图的布局(activity_main_view.xml,也就是我的“根布局”): 这是我的片段类: public class AddNamePane extends Fragment […]

我的Android导航抽屉活动发生了什么?

我正在构建一个OpenGL动态壁纸。 我决定在我的主要活动中安装导航抽屉,因为用户可以访问很多function。 问题/问题如果我按下“硬件”后退按钮来正常关闭应用程序,显示的初始片段只会刷新,应用程序永远不会关闭。 如果我按下主页按钮并返回应用程序,则一切都是黑屏。 我在整个谷歌的搜索中都在想,也许我没有正确地破坏MainActivity或者终止片段。 我试过在main活动的onDestroy方法中调用finish()。 我尝试在每个post中使用片段管理器中的remove方法在每个post中使用我在网上find的post。 没有任何效果。 我很难过。 我在onDestroy方法和片段onDetach方法的主活动中设置了调试点,没有产生错误或给出任何信息。 此时我无能为力。 这是我的MainActivity类。 public class MainActivity extends AppCompatActivity implements OnNavigationItemSelectedListener, OnPostSelectedListener{ FragmentManager mFragmentManager; FragmentTransaction mFragmentTransaction; TextView usrTag, tagrEmail; CircleImageView tagrPic; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, […]

Android中的片段内的选项卡

我试图像在示例中一样在片段中添加TabHost,在调用时获取NullPointerException mTabHost.setup() 可能是什么问题? 代码如下 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tabs_layout,container,false); mTabHost = (FragmentTabHost)rootView.findViewById(android.R.id.tabhost); mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.tabcontent); mTabHost.addTab(mTabHost.newTabSpec(“fragmentb”).setIndicator(“tab1”), Fragment1.class, null); mTabHost.addTab(mTabHost.newTabSpec(“fragmentc”).setIndicator(“tab2”), Fragment2.class, null); return rootView; } XML:

什么是Activity.isFinishing()的片段等价物?

在我的活动中,我经常使用这个成语: @Override public void onDestroy() { super.onDestroy(); if (isFinishing() != true) return; // do some final cleanup since we’re going away for good } Fragment有一个onDestroy()方法,但是isFinishing()的等价物是什么? 我应该从片段的onDestroy()检查getActivity().isFinishing() onDestroy()吗? 编辑添加: 以下是我在各种情况下得到的回调(按顺序),以及getActivity()返回null还是非null,如果非null,则返回getActivity().isFinishing() : 场景#1: DialogFragment正在显示,用户点击后退按钮(即需要发布引用): onDismiss(): activity = non-null, finishing = false onDestroy(): activity = non-null, finishing = false 场景#2:显示DialogFragment并完成父活动(即需要发布引用): onDestroy(): activity = non-null, finishing = true onDismiss(): […]

在Android中保存MapFragment(Maps v2)状态

我正在使用新的GoogleMaps API(v2)并且片段存在一些问题。 我的应用程序(Map,List)中有两个片段,用户可以在它们之间切换。 到目前为止使用此代码正常工作: if (itemPosition == 0) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentpos, myMapFragment).commit(); } else if (itemPosition == 1) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentpos, myListFragment).commit(); }…… 当我使用地图时,切换到列表片段,然后返回到地图片段,不保存地图的最后位置。 这不是我想要的,我希望地图处于保存状态,因为我“离开”它..我怎么能完成这个? 我试图保存相机的位置 public void onSaveInstanceState(Bundle outState){ outState.putDouble(“LAT”, mMap.getCameraPosition().target.latitude); outState.putDouble(“LON”, mMap.getCameraPosition().target.longitude); outState.putFloat(“BEAR”, mMap.getCameraPosition().bearing); … } 并在onCreateView()中恢复它,但Bundle始终为null。 如果我替换片段,则不会调用onSaveInstanceState。 那么如何保存地图的状态呢?

如何通过片段获得有关异步任务结果的通知?

我有一个使用片段的Activity。 根据用户的交互,这些片段可能来来去去。 许多这些片段将作业发送到IntentService,这样就可以以异步方式运行。 IntentService应该如何报告这些工作的结果? 启动作业的片段可能不存在。 如果作业完成且起始片段当前处于活动状态,则应该收到相关通知,并采取相应措施。 如果不是,那么就不需要采取任何行动。 我曾考虑使用广播意图和BroadcastReceiver组件,但片段不能注册接收者,只能注册活动。 你会建议什么解决方案?

Android Honeycomb:如何更改FrameLayout中的碎片,而无需重新创建它们?

是否可以在片段之间切换而无需一直重新创建片段? 如果是这样,怎么样? 在文档中,我find了如何替换Fragments的示例。 // Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); 但是我不希望每次需要时都从头开始创建我的碎片。 我还发现了隐藏/显示片段的这个例子 : // The content view embeds two […]