Articles of android fragments

启用/禁用Android ActionBar.Tab

我正在开发一个使用新Tabs系统(ActionBar.addTab())的应用程序,我将有3个选项卡。 在确定的过程中,我想锁定(禁用)其中两个(不删除,只是不接受点击而不更改’选择器’。 我无法更改内容(通过实现TabListener而不更改片段等)但选择器更改。 反正只有禁用/启用标签? 无需删除并再次添加? 提前致谢! BR,Danilo

解除DialogFragment时的布局拉伸

我有一个具有以下布局的Activity: // ICONS add_item_btn在点击时有一个事件,它创建一个全屏 (编辑后添加此信息) DialogFragment插入项目信息并将其添加到本地数据库。 以下代码显示了我如何创建DialogFragment : FragmentManager fragmentManager = getSupportFragmentManager(); InsertItemDialogFragment fragment = new InsertItemDialogFragment(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); transaction.add(android.R.id.content, fragment).addToBackStack(null).commit(); 问题在于,当我dismiss()创建的片段时,活动布局会延伸,其方式是BottomBar落后于屏幕上的按钮栏一半(参见图像)。 我尝试更改FragmentTransaction (从android.R.id.content到R.id.main_content ,当main_content是根RelativeLayout的id时)没有成功。 我还尝试使用Material Design Bottom Navigation Bar的两种不同实现,但两者都具有相同的行为。

Android:屏幕旋转时的片段生命周期

我知道http://developer.android.com/guide/components/fragments.html的图2我想知道当我旋转屏幕并最终回到“Fragment Active”时,“Fragment Active”会发生什么。 我的问题的背景是我有一个应用程序,无论我是以纵向还是横向模式启动它都能正常工作。 但是在屏幕旋转时它会转储 Fragment com.bla.bla did not create a view. 这个片段基本上只有onCreateView实现,没有别的 public View onCreateView(LayoutInflater i, ViewGroup c, Bundle s) { return i.inflate(R.layout.mylayout, c, false); } 知道屏幕旋转到底发生了什么,我希望能解决这个问题…… 编辑: 我尝试了评论者提出的建议,以及更多相关信息。 所以他们基本上都建议有一个空的活动布局,如果我正确看到,就会以编程方式添加片段。 我有一个纵向的main.xml和一个用于横向的main.xml,现在看起来非常相似(差异是水平与垂直): main.xml中: 我的活动的onCreate方法如下所示: super.onCreate(savedInstanceBundle); setContentView(R.layout.main); Fragment1 f1 = newFragment1(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.myContainer, f1); //and I need a second fragment Fragment2 f2 = […]

带有地图自定义片段的Robolectric 3.0 InflateException

我已经看到许多话题谈论这个问题,例如关于SNAPSHOT版本的这个答案 。 这仍然是必要的,因为当我尝试设置我的活动时,我得到: android.view.InflateException: XML file /Users/billey_b/android/android/app/build/intermediates/res/merged/targetARTVm/debug/layout/activity_preorder.xml line #-1 (sorry, not yet implemented): Error inflating class fragment android.view.InflateException: XML file build/intermediates/res/merged/targetARTVm/debug/layout/activity_preorder.xml line #-1 (sorry, not yet implemented): Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) at com.heetch.activities.PreOrderActivity.onCreate(PreOrderActivity.java:72) at android.app.Activity.performCreate(Activity.java:5933) at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:195) […]

从片段中使用适配器中的picasso获取图像

我有一个循环视图,它使用包含textview和imageview的自定义适配器从api获取数据,我在Activity中实现了它并且工作正常,但现在我尝试使用片段而不是活动,并且除了图像之外,每个东西都工作正常将代码移动到片段后不显示所以这是我的片段: public class TVFragment extends Fragment implements TVAdapter.TVAdapterOnClickHandler { TVAdapter mAdapter; RecyclerView mSportsList; String sortsports=”sports.php”; Context mContext ; public static TVFragment newInstance() { TVFragment fragment = new TVFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { } } @Override public View onCreateView(LayoutInflater […]

无论如何交换或重新排序片段BackStack条目?

我正在创建多个片段应用程序,这需要轻松更改片段选项卡,必须保留其BackStack条目。 在用户点击片段必须立即popup。 我认为重新排序BackStack是最好的选择。 有谁知道如何重新订购BackStack? 我有5个片段A,B,C,D,E。 如果用户打开片段,如A —> B —> C —> D —> E. 使用默认的后栈,后退键可以正常工作。 但是当用户打开A —> B —> C —> D —> E —> B.此后如果用户单击后退,默认后退堆栈将转到A.

当必须保存父活动的状态时,如何处理片段事务?

我的应用程序有几个片段和活动。 在主要父活动的生命周期的过程中,应用程序在其他活动中向用户呈现信息/选项。 Fragments的文档对commit()有以下规定: 警告:您只能在活动保存其状态(用户离开活动时)之前使用commit()提交事务。 如果在该点之后尝试提交,则将引发exception。 这是因为如果需要恢复活动,则提交后的状态可能会丢失。 对于可以丢失提交的情况,请使用commitAllowingStateLoss()。 问题是,在返回父活动之后,我再也不能使用FragmentTransactions,它是我在应用程序中设计导航的方式不可或缺的。 我想到的一个解决方案是将我的活动更改为片段,但我的应用程序最终也会使用应用内结算,我相信它始终会开始自己的活动。 这似乎是一个巨大的限制 – 在开发的某个阶段,我最终将不得不显示一个单独的活动。 我可能会使用commitAllowingStateLoss(),但我觉得我错过了Android平板电脑应用程序开发中的一个主要概念。 有没有办法启动活动然后返回父活动(管理片段)而不会失去提交FragmentTransactions的能力?

Android – 在运行时更改片段布局

我想在我的应用程序中实现单活动多碎片设计。 我计划在代码中切换几个“屏幕”(片段的布局),我可以在它们之间切换(可能添加到后台)。 根据我的理解,每个屏幕中片段的布局是使用Layout对象(例如FrameLayout)设置的,它们充当片段的占位符(共享相同的ID)。 由于不同的屏幕有不同的片段排列(一个可能是FrameLayout,另一个是LinearLayout等),我想知道:如何在运行时切换片段的布局? 我理解添加/替换Fragments(通过FragmentManager),但我想在实时活动中完全添加包含它们的新布局。 有点像为“setContentView”进行交易…… 我该怎么做呢? 谢谢! 丹尼。

片段仍然添加到backstack而不调用addToBackStack,为什么?

我正在制作片段更换器助手类,我有一些问题。 我称之为FragmentChanger 它有一个fragmentContainer ,它是一个ViewGroup ,它包含我想要显示的所有片段。 我做了自己的replace(Fragment fragmentToChange, boolean needSaveToBackStack) function是: 从fragmentContainer中删除旧片段 将新片段添加到fragmentContainer 可选择保存到backStack,需要needSaveToBackStack为true或false 。 错误如下: 如果我使用我的替换function保存到backStack它工作正常,我可以使用我的设备的后退按钮踩回到预先添加的片段它像魅力一样工作。 但是当我想要将一个片段替换为保存到backStack的片段时,我的代码中有一些错误,因为当我退后时, 我可以在屏幕上看到我没有添加到backStack的片段 ,而且我还可以看到另一个同时添加了片段! 所以我可以在同一时间看到2个片段,如下所示: 这是我的代码: //It is my helper class to handle replacing fragments. public class FragmentChanger { // fragmentTransaction FragmentTransaction fragmentTransaction; // the container for fragments ViewGroup fragmentContainer; // activity ofc Activity act; // Ctr: adding a default […]

AsyncTask,Fragments,Views和Backstacks

我一直在使用这种模式。 这是一个非常人为的AsyncTask +进度指示器示例: new AsyncTask() { WeakReference weakFragment = new WeakReference(MyFragment.this); @Override protected void onPreExecute() { Fragment fragment = weakFragment.get(); if(fragment != null) fragment.getView().findViewById(R.id.progress).setVisibility(View.VISIBLE); } @Override protected Document doInBackground(Void… params) { Fragment fragment = weakFragment.get(); if(fragment == null) return null; // Do something … } @Override protected void onPostExecute() { Fragment fragment = weakFragment.get(); if(fragment […]