标签: fragment-lifecycle

片段中onCreate(),onCreateView()和onActivityCreated()的区别和用法

什么是之间的差异onCreate(),onCreateView()以及onActivityCreated()将它们各自用于片段和什么?

android oncreate android-lifecycle android-fragments fragment-lifecycle

298
推荐指数
3
解决办法
13万
查看次数

为什么片段中的getContext()有时会返回null?

为何getContext()有时会回归null?我将上下文LastNewsRVAdapter.java作为参数传递.但LayoutInflater.from(context)有时会崩溃.我在游戏机上收到一些崩溃报告.以下是崩溃报告.

java.lang.NullPointerException
com.example.adapters.LastNewsRVAdapter.<init>

java.lang.NullPointerException: 
at android.view.LayoutInflater.from (LayoutInflater.java:211)
at com.example.adapters.LastNewsRVAdapter.<init> (LastNewsRVAdapter.java)
at com.example.fragments.MainFragment$2.onFailure (MainFragment.java)
or                     .onResponse (MainFragment.java)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run 
(ExecutorCallAdapterFactory.java)
at android.os.Handler.handleCallback (Handler.java:808)
at android.os.Handler.dispatchMessage (Handler.java:103)
at android.os.Looper.loop (Looper.java:193)
at android.app.ActivityThread.main (ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative (Method.java)
at java.lang.reflect.Method.invoke (Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:641)
at dalvik.system.NativeStart.main (NativeStart.java)
Run Code Online (Sandbox Code Playgroud)

这是LastNewsRVAdapter.java构造函数.

public LastNewsRVAdapter(Context context, List<LatestNewsData> 
    latestNewsDataList, FirstPageSideBanner sideBanner) {
    this.context = context;
    this.latestNewsDataList = latestNewsDataList;
    inflater = LayoutInflater.from(context);
    this.sideBanner = sideBanner;
}
Run Code Online (Sandbox Code Playgroud)

这是onCreateView …

android android-fragments fragment-lifecycle

28
推荐指数
2
解决办法
2万
查看次数

在旋转和背面恢复MapView的状态

背景

我有一个更大的应用程序,我在使用新的Google Maps API时遇到了一些问题.我尝试用不同的问题描述它,但由于它看起来太复杂,我决定开始一个新项目,尽可能简单并尝试重现问题.所以这就是.

情况

我正在使用Fragments并希望放入MapView内部.我不想用MapFragment.我准备的示例项目可能不是很漂亮,但我试图让它尽可能简单,它必须包含原始应用程序中的一些元素(再次简化).我有一个Activity和我的习惯Fragment,MapView以编程方式添加.将Map包含一些点/ Markers.点击一个之后MarkerInfoWindow被示出并点击它引起下Fragment所示(与正被replace()在内容功能).

问题

我有两个问题:

  1. 当显示Mapwith 时,Markers屏幕旋转会导致Class not found when unmarshalling我的自定义MyMapPoint类错误- 我不知道为什么以及它意味着什么.

  2. 我点击Marker然后InfoWindow.在此之后我按下硬件后退按钮.现在我可以看到Map但没有Markers并且集中在0,0一点.

代码

主要活动

public class MainActivity extends FragmentActivity {

    private ArrayList<MyMapPoint> mPoints = new ArrayList<MyMapPoint>();

    @Override
    protected void onCreate(Bundle …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-mapview android-maps-v2 fragment-lifecycle

26
推荐指数
1
解决办法
3万
查看次数

add()和replace()与Fragment的生命周期之间的区别

我的程序有6个片段:Fragment1,Fragment2,....-> Fragment6.

我使用add()和replace()语句在片段之间切换并跟踪它们的生命周期.

Fragment1 添加 Fragment2 添加 Fragment3 添加 Fragment4 添加 Fragment5 替换 Fragment6

log-cat显示了它们的生命周期(我在onCreate,onCreateView,onDestroyView,onDestroy中有一些printf-points用于跟踪)


标签 __ _ __ _ __ _ __ _ __ 文字

Fragment1_ _ __ _ ___ _onCreate

Fragment1_ _ __ _ ___ _onCreateView

Fragment1_ _ __ _ ___ _add Fragment2

Fragment2_ _ __ _ ___ _onCreate

Fragment2_ _ __ _ ___ _onCreateView

Fragment2_ _ __ _ ___ _add Fragment3

Fragment3_ _ __ _ ___ _onCreate

Fragment3_ _ __ _ ___ _onCreateView

Fragment3_ _ __ _ …

android android-fragments fragment-lifecycle

19
推荐指数
2
解决办法
2万
查看次数

在片段事务期间了解Fragment的lifeCycle方法调用

我创建了一个演示来了解在片段事务的不同情况下调用所有片段生命周期的方法.虽然大多数调用都是按照期望的,我仍然很困惑,我用Bold写的.

假设有两个片段A和B,我们正在它们之间执行事务

情况1

将片段B添加到片段A时

getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, fragementB).addToBackStack(null).commit();
Run Code Online (Sandbox Code Playgroud)

片段B

onAttach

的onCreate

onCreateView

onActivityCreated

在onStart

的onResume

没有调用Fragment A的生命周期方法.

我的期望是什么?

由于片段A不可见,因此调用片段A的onStop方法

根据文件 -

停止 - 片段不可见.主机活动已停止或片段已从活动中删除但已添加到后台堆栈.已停止的片段仍处于活动状态(系统会保留所有状态和成员信息).但是,它不再对用户可见,并且如果活动被杀死将被杀死.

这是否意味着在同一活动中添加新片段时不会调用当前片段的方法?

然后popBackStack()在片段B中使用

片段B

在onPause

的onStop

onDestroyView

的onDestroy

onDetach

没有调用Fragment A的生命周期方法

我的期望是什么?

由于片段A现在可见,因此调用片段A的onStart方法

案例2

当片段B替换片段A时

getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).commit();
Run Code Online (Sandbox Code Playgroud)

片段B

onAttach

的onCreate

onCreateView

onActivityCreated

在onStart

的onResume

片段A.

在onPause

的onStop

onDestroyView

的onDestroy

onDetach

一切都是按照期望的

案例3

当片段B替换片段A时,将其保留在后台

 getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragementB).addToBackStack("tag").commit();
Run Code Online (Sandbox Code Playgroud)

片段B

onAttach

的onCreate

onCreateView

onActivityCreated

在onStart

的onResume

片段A.

在onPause

的onStop

onDestroyView

不调用片段A的onDestroy和onDetach方法.为什么不调用它?按照文档方法Bcoz replace删除容器中已有的任何片段并将新片段添加到同一个容器中

然后popBackStack()在片段B中使用

片段A.

onCreateView

onActivityCreated

在onStart

的onResume …

android android-fragments fragment-lifecycle

15
推荐指数
2
解决办法
9540
查看次数

Fragment实例中带有Otto事件总线的IllegalArgumentException

我正在使用Otto Event总线订阅ListFragment中的某些事件.总线实例在Application的子类中存储和创建,换句话说,它应该作为单例工作.看来这不是一个案例......

该片段正在注册到总线onActivityCreated(Bundle)并取消注册onDestroy().这不起作用.我从调用应用程序崩溃的设备获得了几个崩溃报告unregister()(java.lang.IllegalArgumentException:缺少注释方法的事件处理程序......).如果unregister()在调用register()之前调用,或者unregister()调用两次,则抛出此异常.这可能只发生在......

  • onActivityCreated(Bundle)之前没有打过电话onDestroy().
  • onDestroy() 被叫两次.
  • Application实例调用之间重建onActivityCreated(Bundle)onDestroy().

我的应用类:

public class App extends Application {

    private static App sInstance;

    private Bus bus;

    public static App getInstance() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        bus = new Bus(ThreadEnforcer.ANY);
    }

    public Bus getEventBus() {
        return bus;
    }

}
Run Code Online (Sandbox Code Playgroud)

Fragment类:

public class MyFragment extends ListFragment {

    @Override
    public void …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-fragments otto fragment-lifecycle

13
推荐指数
1
解决办法
9166
查看次数

片段被销毁后停止处理程序

我有一个Fragment设置a ListView并创建一个定期Handler更新Listview.然而,看起来它Handler仍然在Fragment被破坏后运行.

以下是代码.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    //boilerplate code

    final Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            assignAdapter();
            handler.postDelayed(this, 15000);
        }
    });

    return v;
}
Run Code Online (Sandbox Code Playgroud)

ListView销毁之后更新Fragment会导致应用程序崩溃.如何HandlerFragment被摧毁时使其停止?我也想知道如果有任何暂停应用程序的影响Handler也是如此.

android listview android-lifecycle android-fragments fragment-lifecycle

13
推荐指数
2
解决办法
1万
查看次数

LifeCycleAware片段中的片段生命周期事件

我有一个生命周期识别片段和一个LifecycleObserver

        public class MyFragment extends Fragment {
            @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                new MyObserver(this);

            }

            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
                return inflater.inflate(R.layout.activity_main, container, false);
            }
        }
Run Code Online (Sandbox Code Playgroud)

以下是我的Observer类,它记录了所有片段事件

        public class MyObserver implements LifecycleObserver {
            private static final String TAG = "MyObserver";
            public MyObserver(LifecycleOwner lifecycleOwner) {
                lifecycleOwner.getLifecycle().addObserver(this);
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
            public void onCreate(){
                Log.d(TAG, "onCreate: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
            public void onPause(){
                Log.d(TAG, "onPause: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            public void onDestroy(){
                Log.d(TAG, "onDestroy: …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-fragments fragment-lifecycle

8
推荐指数
2
解决办法
3113
查看次数

片段生命周期重叠导航

我有一个使用导航组件切换的Activity多个应用程序Fragments.当我在两个片段之间切换时,它们onCreate()onDestroy()方法似乎重叠.因此,当我们访问相同的全局对象时,我很难为片段编写初始化和清理代码.

导航Framgent_AFragment_B具有以下方法顺序:

Fragment_B.onCreate()
Fragment_A.onDestroy()
Run Code Online (Sandbox Code Playgroud)

Fragment_A.onDestroy()我逆转我做的操作Fragment_A.onCreate().而且Fragment_B我希望事情在onCreate()被召唤时处于中立状态.然而事实并非如此,因为Fragment_A.onDestroy()尚未召集.

Android上的重叠是否正常,或者我的导航组件中是否配置了错误?还有另一种方法可以实现我想做的事情吗?我知道我可以将两者结合起来Fragments并使其发挥作用,但我不想让Fragment彼此了解.对我而言,Framgnet_AFragment_B创建时,仍然存在时似乎很奇怪,何时Fragment_B应该替换Fragment_A.

任何帮助是极大的赞赏!


编辑:

在调试源代码之后,我发现在FragmentNavigator.navigate() FragmentTransaction.setReorderingAllowed()中调用了它,它允许重新排序操作,甚至允许在前一个之前onCreate()调用一个新的片段onDestroy().问题仍然存在,如何在下一个片段中初始化相同的全局状态之前解决我在一个片段中正确清理全局状态的问题.

android fragment-lifecycle android-architecture-components android-jetpack android-architecture-navigation

8
推荐指数
2
解决办法
1051
查看次数

使用导航图范围注入视图模型:NavController 在 onCreate() 之前不可用

我在我的应用程序中使用导航组件,并在同一图中的多个片段之间使用共享 ViewModel。现在我想用这个图形范围实例化视图模型

如您所知,我们应该onAttach在片段中注入对象(ViewModel、..etc)

但是当我想这样做(在 中注入具有图形范围的 ViewModel onAttach)时,会发生此错误:

IllegalStateException: NavController is not available before onCreate()
Run Code Online (Sandbox Code Playgroud)

你知道我怎么做吗?

android fragment-lifecycle dagger-2 android-viewmodel android-architecture-navigation

7
推荐指数
1
解决办法
3543
查看次数