Articles of android fragments

尝试在空对象引用上调用虚方法’android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’

我的应用程序包含4个片段作为使用FragmentPagerAdapter加载到父片段内的制表符。 问题是,当我运行应用程序并按下并重新打开应用程序时,我收到此错误日志: FATAL EXCEPTION: main java.lang.NullPointerException: Attempt to invoke virtual method ‘android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’ on a null object reference at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949) at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513) … 父片段内的代码行是: viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); 和ViewPage和Adapter都不是空的! 我必须提到我的所有Fragment的生命周期都在管理中,并且在适配器内部发生了null问题!当我使用Activity作为父级而不是Fragment时,同样的适配器工作正常!

Android:Fragment无法获得活动

我有一个执行片段事务的活动 DetailFragment newFragment = new DetailFragment(); transaction.replace(R.id.mylist, newFragment); transaction.addToBackStack(null); transaction.commit(); 工作正常。 现在我在我的活动中知道了一个动态字符串,我需要在newFragment中的布局中替换它。 我以为我可以在transaction.commit()之后调用类似的东西 newFragment.setMyString(“my dynamic value”); 而在newFragment.java中我有 public void setMyString(String s) { TextView tv = (TextView) getActivity().findViewById(R.id.myobject); tv.setText(s); } 关键是getActivity()返回null。 如何获得查找布局元素所需的上下文? 编辑: 我尝试使用捆绑包来跟踪路线,因为这似乎是最干净的方式。 所以我改变了我的代码: Bundle b = new Bundle(); b.putString(“text”, “my dynamic Text”); DetailFragment newFragment = new DetailFragment(); transaction.replace(R.id.mylist, newFragment); transaction.addToBackStack(null); transaction.commit(); 我的片段onCreateView看起来像这样: public View […]

替换碎片不起作用/我是否以正确的方式执行此操作?

我花了一些时间来绕过碎片,但这应该是我关于碎片的最后一个问题,因为我认为我只是让它们失效。 我知道这是一堆乱七八糟的代码。 但我很感激帮助,以确保我没有违反任何碎片的基本规则。 我将发布我的所有代码,看看是否有人可以“查看它”,看看我是否犯了重大错误,或者我是否应该采用更简单的方法。 最后,正如标题中所述,我的片段没有被替换……它被添加到顶部。 文件树: MainActivity.java: package com.example.learn.fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; public class MainActivity extends FragmentActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } /* […]

在方向更改中保留列表片段中的列表

我有一个使用片段的应用程序,所有这些都包含在一个活动中。 活动以包含按钮菜单的片段开始,所有这些按钮都会导致各种listfragments替换原始按钮/菜单片段。 我的问题是,在方向更改时,如果活动正在显示其中一个列表视图,它将消失并返回按钮菜单。 我理解为什么会发生这种情况……活动被破坏并重新创建,但不是如何解决它并通过方向更改维护列表视图/当前片段。 我在这里find了setRetainInstance和使用示例,但是我无法弄清楚如何将它应用于我的情况下使用按钮菜单或者我想要保留的片段可能是几个不同的片段之一。 下面是简化的代码,以显示主要活动和一个listfragments。 任何指向添加内容的指针都将非常感激,以便保留列表片段。 活动 public class Main extends FragmentActivity { private MainMenuFragment menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); menu = new MainMenuFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit(); } } ListFragment public class ItemListFragment extends ListFragment { private TextView header; private TextView empty; private Button add; public static Cursor itemCursor; private GroceryDB […]

如何将进度对话框设置为在作为片段进行管理时不可取消?

我正在使用作为Fragment管理的ProgressDialog 。 即使我将ProgressDialog设置为不可取消,BACK按钮仍然可以从堆栈中删除该Fragment 。 我的内心课看起来像这样: public static class ProgressDialogFragment extends DialogFragment { private DialogStyle dialogStyle; public static ProgressDialogFragment newInstance(String title, String message) { ProgressDialogFragment fragment = new ProgressDialogFragment(); Bundle args = new Bundle(); args.putString(“title”, title); args.putString(“message”, message); fragment.setArguments(args); return fragment; } public void setDialogStyle(DialogStyle dialogStyle) { this.dialogStyle = dialogStyle; } @Override public ProgressDialog onCreateDialog(Bundle savedInstanceState) […]

popup窗口以显示片段中的某些内容

我试图制作类似popup窗口的东西,当点击片段中的视图时会出现。 我想要这个popup窗口或其他什么,不要让片段变暗,就像Dialog Fragment那样。 而且我还希望popup窗口位于单击视图的位置。 如果它有自己的活动和布局会很好,所以我可以在其中进行一些自定义更改。 你能告诉我一些示例代码吗?

DialogFragment.dismiss与NullPointerException崩溃

我正在做一些后台工作并在我这样做时显示DialogFragment。 完成我的工作并调用相关的回调后,我将关闭该对话框。 当我这样做时,我在Android源代码中遇到了由NPE引起的崩溃,这里: void dismissInternal(boolean allowStateLoss) { if (mDialog != null) { mDialog.dismiss(); mDialog = null; } mRemoved = true; if (mBackStackId >= 0) { getFragmentManager().popBackStack(mBackStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE); mBackStackId = -1; } else { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.remove(this); if (allowStateLoss) { ft.commitAllowingStateLoss(); } else { ft.commit(); } } } 特别是在这一行: FragmentTransaction ft = getFragmentManager().beginTransaction();

如何以编程方式更改Google Maps v2(支持片段)的宽度和高度?

如何以编程方式更改com.google.android.gms.maps.SupportMapFragment的宽度和高度? 我想你可以将它包装在一个带有match_parent的视图组中,但是如果我不需要,我希望不要嵌套(老实说甚至不确定它是否有效)。 为了给出上下文,我想在地图点击时将地图从一个高度扩展到另一个高度。 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { expandMap(); // not sure how to do this programatically. } }); 任何帮助都会很棒!

Android:返回上一个片段

我已经实现了Navigation Drawer,它是Activity的子类。 我的应用程序中有很多片段。 我的问题在这里 想象一下有3个片段: Fragment_1:Fragment_2:Fragment_3 当我启动我的应用程序时,Fragment_1被加载当我点击Fragment_1上的一些组件时,我将导航到Fragment_2,依此类推。 就这样 Fragment_1> Fragment_2> Fragment_3 当我从Fragment_2按回键时,我将导航回Fragment_1但是当我从Fragment_3按回键时,我将导航回Fragment_1(而不是Fragment_2) 我在Back Key按下的应用程序中想要这样的东西 Fragment_1 <Fragment_2 <Fragment_3 我使用Fragment,FragmentManager,FragmentTransaction如下: MyFragment fragment = new MyFragment(); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit(); 我尝试在我的MainActivity中覆盖onBackPressed(): @Override public void onBackPressed() { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); int count = getFragmentManager().getBackStackEntryCount(); if (count == 0) super.onBackPressed(); }

Android支持库27,片段更新?

自从我将项目更新到SDK版本27并将支持库的gradle插件更新到版本27.0.0我需要更改我的代码。 使用26.1.0我可以在我的Fragment ( android.support.v4.app )中使用getContext() (使用Kotlin context )并且我没有可空性问题,但是因为我使用Kotlin我遇到了版本27.0.0的问题,我的所有context调用都不再起作用了,我需要一个安全操作符,就像context!!一样context!! ,但是因为我个人觉得每次我做自己的工作都是一种喧嚣 override fun getContext() = super.getContext()!! 改变的另一件事(突然,这就是我要问的原因)是onCreateView()和onViewCreated() 。 在onCreateView ,inflater不再是null,所以我需要更改我的函数签名以正确覆盖onCreateView(inflater: LayoutInflater?…)到onCreateView(inflater: LayoutInflater…)并且对于createdView参数也是createdView 。 onViewCreated 。 所以现在我想知道为什么,特别是(对于Kotlin)非常丑陋的getContext()更改已经完成并转向https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html 。 但等等,显然他们没有改变它? 所以现在我的问题是,如果我做错了什么或者他们是否真的改变了它,如果是这样,我可能会问他们为什么? 顺便说一句,同样适用于getActivity() ,我认为添加了mHost == null检查, getActivity方法甚至是最终的,所以我不能在那里使用我的解决方法,这使得它非常难看。 实际上在源文件中方法看起来是一样的,但是26.1.0有Kotlin返回typesContext! 和27.0.0返回typesContext? 。