【问题标题】:Do the initial callbacks of a fragment get called before or after Activity onStart()?片段的初始回调是在 Activity onStart() 之前还是之后调用的?
【发布时间】:2017-09-16 18:46:02
【问题描述】:

https://github.com/xxv/android-lifecycle 显示片段 onAttach、onCreate、on CreateView 和 onActivityCreated 在活动 onStart 之前被调用。但是,我尝试记录以下内容:

   public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("TRACE", "MainActivity onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Fragment firstFragment = FirstFragment.newInstance();
        getSupportFragmentManager().beginTransaction().replace(R.id.content, firstFragment).commit();
    }

    @Override
    public void onStart() {
        Log.e("TRACE", "MainActivity onStart");
        super.onStart();
    }

FirstFragment 看起来像这样:

public class FirstFragment extends Fragment {

    public FirstFragment() {
        // Required empty public constructor
    }

    public static FirstFragment newInstance() {
        FirstFragment fragment = new FirstFragment();
        return fragment;
    }

    @Override
    public void onAttach(Context context) {
        Log.d("TRACE", "FirstFragment onAttach");
        super.onAttach(context);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d("TRACE", "FirstFragment onCreate");
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("TRACE", "FirstFragment onCreateView");
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.d("TRACE", "FirstFragment onActivityCreated");
        super.onActivityCreated(savedInstanceState);
    }

它打印了这个:

  1. MainActivity onCreate
  2. MainActivity onStart
  3. FirstFragment onAttach
  4. 创建第一个片段
  5. CreateView 上的第一个片段
  6. ActivityCreated 上的FirstFragment
  7. MainActivity onResume

【问题讨论】:

标签: android android-lifecycle


【解决方案1】:

这取决于如何Fragment 添加到Activity

将片段添加到活动有两种常用方法:通过 XML 中的 <fragment> 标记或通过在 Java 中执行的 FragmentTransaction

如果您不提供R.id.content 视图并使用FragmentTransaction,而是使用类似这样的活动布局来创建FirstFragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.example.stackoverflow.FirstFragment"/>

</LinearLayout>

您会在日志中看到这一点:

E/TRACE   ( 6094): MainActivity onCreate
D/TRACE   ( 6094): FirstFragment onAttach
D/TRACE   ( 6094): FirstFragment onCreate
D/TRACE   ( 6094): FirstFragment onCreateView
E/TRACE   ( 6094): MainActivity onStart
D/TRACE   ( 6094): FirstFragment onActivityCreated
E/TRACE   ( 6094): MainActivity onResume

至于为什么你在使用FragmentTransaction 时看到消息的顺序是这样的,归根结底是事务是异步;不能保证在您调用commit() 时它会立即执行。在您的情况下,系统实际上直到您的活动 onStart() 之后才开始执行它。

【讨论】:

  • 谢谢,它确实打印出来了。 github.com/xxv/android-lifecycle 显示在 Activity onStart 之前调用了 onActivityCreated,这是一个错误还是我误解了图表?
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多