Articles of android fragments

导航抽屉的碎片管理

我正在开发一个应用程序,我只使用1个主要活动和多个片段,包括ViewPager ,自定义video/图像库,全屏片段(没有工具栏或底部导航按钮)。 我不确定这是好的做法,但我面临的问题很少。 上图是实际的App层次结构。 在我面临的问题之后。 工具栏不会更改片段的标题,按下后退按钮或通过单击按钮或某个链接前进。 如果我使用以下方法更改为后退箭头,导航汉堡会继续显示using: getSupportActionBar().setDisplayHomeAsUpEnabled(true); 然后后退箭头打开抽屉,但不会回到最后一个片段。 按下按钮或直接跳转到某个片段时的片段状态丢失。 使用单一Activity在Fragment执行所有任务是否是一种好习惯。 我也在使用单个工具栏整个应用程序。 Toolbar.xml 导航抽屉(单个活动所有碎片的父级) public class Navigation_Drawer extends AppCompatActivity implements UserData { Toolbar toolbar; DrawerLayout drawerLayout; NavigationView navigationView; String navTitles[]; TypedArray navIcons; RecyclerView.Adapter recyclerViewAdapter; ActionBarDrawerToggle drawerToggle; public static final String TAG = “###Navigation Drawer###”; boolean nextScreen; //Header ImageView headerImage,headerUserImage; TextView userName,userViews; Context context = this; […]

ViewPager setCurrentItem Slide

我有一个Activity包含ViewPager,这个ViewPager中的第一个Fragment包含ListView,当我点击任何Item时它用选定的一个替换这个Fragment,我使用setCurrentItem(selectedItem,true)//for smooth scroll但是ViewPager在选中之前滑过所有Fragment片段我想让它滑动到选定的片段而不是我尝试使用PageTransfrom.transformPage所有片段 @Override public void transformPage(View page, float position) { int currentItem = viewPager.getCurrentItem(); if (currentItem != selectedItem) page.setVisibility(View.GONE); } 但没有运气

片段如何处理触摸?

我正在玩android的Fragments ,我发现了一些对我来说没什么意义的东西。 我正在使用兼容性软件包并在2.3.3的nexus上进行测试,因为我还没有motorola xoom。 我的问题是:当我用另一个fragment替换fragment时,后面的fragment继续接收触摸。 这是重现的代码。 我有一个项目列表,当你按一行时,将创建并显示一个新的片段。 但是如果你触摸绿色片段,它将被ListFragment接收,增加后退按钮的数量,我必须回到ListFragment 。 有人可以解释原因吗? 编辑:正如CommonsWare建议的那样,我删除了粘贴在这里的代码,因为我在android问题跟踪器中打开了这个问题,你可以从那里下载演示项目。

Android慢软键盘打开

我有一个非常讨厌的问题。 在Android中制作registry单,当EditText获得焦点时,键盘就会出现。 但它真的很慢。 即使在高端设备上也需要5秒或更长时间。 我们的应用程序使用多个层次的碎片。 所以我想可能计算所有这些图层向上滑动(当键盘出现时)需要这么长时间。 当我在清单文件中设置“adjustNothing”时,键盘会快速显示,而在另一个我们只有一层片段的活动中(这一层是registry单),它也会很快出现。 有人有类似的问题或建议吗? (隐藏或删除注册下方的片段不是一种选择)

VideoView不会显示在片段上

我在三星S3(Android 4.1.1)中运行video时遇到问题,问题似乎是因为video片段在片段上,因为如果我把它放在活动上,它就可以了。 另外我发现如果我打开GPU硬件加速,video就可以工作了。 我还有一个通过在SurfaceView上绘制而制作的游戏,该视图也不起作用(仅在启用GPU的情况下)…应用程序内容的其余部分按其应该显示(按钮和其他布局)。 我在Nexus S和模拟器上测试了应用程序,它在其他设备上运行良好。 有谁知道是什么问题? 谢谢! 这是代码: public class VideoFragment extends Fragment implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener { private Video mVideo; private VideoView mVideoView; // The video position private int mPosition; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.screen_video, container, false); mVideoView = (VideoView) fragmentView.findViewById(R.id.VideoView); return fragmentView; } […]

ViewPager片段娱乐,恢复但不可见

我有一个ViewPager + FragmentPageAdapter的问题。 场景:我在片段A中有一个活动。片段A有一个带有片段B1和片段B2的ViewPager。 B1 e B2是相同的类,但不同的数据作为参数。 问题:创建时一切都很好。 但是当应用程序进入后台并且进程被android杀死时,尝试恢复最后状态,再次启动应用程序,片段B1 e B2在前景中不可见,而片段A是。 有点奇怪的是,片段B1和B2在片段A的ChildFragmentManager中,并且由于onStart()和onResume()被调用(由Log看到)而被恢复。 此外,寻呼机恢复两页,但空或更好,没有任何可见。 如果我很清楚FragmentPagerAdapter是如何工作的,那么它应该负责管理自己的片段以及如何重新创建片段。 此外,为了强制执行这一点,如果已经存在具有指定标记的该位置的片段,则FragmentPagerAdapter在从后台返回时不会调用getItem(int position)。 …那么为什么我看不到Fragment B1 e B2,只有传呼机空了? 这是我的示例代码。 FragmentA @Override public void onStart() { super.onStart(); populateViewPager(); } private void populateViewPager() { pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager())); indicator.setViewPager(pager); indicator.notifyDataSetChanged(); } FragmentPagerAdapter public class MyFragmentPageAdapter extends FragmentPagerAdapter { public MyFragmentPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment […]

从tablayout,android获取标签或id的片段

我使用本教程创建选项卡。 现在我在每个片段中都有一个recyclerview,我想从mainactivity通知他们。 如何访问片段中的适配器? 我用它来调用片段中的refreshData()方法: TabFragment1 tabFragment = (TabFragment1) getSupportFragmentManager().findFragmentByTag(TabFragment1.class.getSimpleName()); if (tabFragment != null) { tabFragment.refreshData(); } 但是返回null。 主要活动: TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.addTab(tabLayout.newTab().setText(“Tab1”)); tabLayout.addTab(tabLayout.newTab().setText(“Tab2”)); final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override […]

我可以删除layout.xml文件中定义的片段吗?

是否可以使用FragmentTransaction和remove()方法来删除layout.xml中定义的片段(使用片段标记)? 我没有使用支持库v4来实现这一点。 在调用remove()之后,在提交FragmentTransaction之后片段保持不变。 任何人都能告诉我这是设计,错误还是function? 可以替换lyaout.xml中定义的片段,所以我觉得有点奇怪的是它不可能删除它?

Android Fragment getActivity()= null

我在我的应用程序中使用片段。 使用它们时非常常见的问题是使用getActivity()时的NPE。 我知道我们可以通过每次检查getActivity() != null或检查片段是否为isAdded()来解决它。 在我的一个课程中,我在60多个地方获得了活动的背景。 检查getActivity()是否为null或者片段是否仍然添加到所有位置的活动中会使代码变得丑陋,更大且不可维护。 有没有其他方法来处理这个? 当它从活动中移除时,甚至可以销毁碎片(并在被移除时停止它一直在做的工作)吗? 这是一个建议的方式吗?

getParentFragment API 16

我们都知道Fragment getParentFragment是在API 17中引入的。 那么如果我们想在API 16及更低版本中获取父片段呢(考虑到我使用支持FragmentStatePagerAdapter本机FragmentStatePagerAdapter并且嵌套片段没有问题) 还有比我更好的方法吗? 在父母: public class ParentFragment extends Fragment { public static ParentFragment StaticThis; … @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { super.onCreate(savedInstanceState); StaticThis = this; … } 在孩子: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) parentFragment = (ParentFragment) getParentFragment(); else parentFragment = ParentFragment.StaticThis;