2017-09-16 125 views
0

https://github.com/xxv/android-lifecycle显示onAttach,onCreate,CreateView和onActivityCreated上的片段在活动onStart之前被调用。不过,我想记录此:Activity 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. FirstFragment的onCreate
  5. FirstFragment onCreateView
  6. FirstFragment onActivityCreated
  7. MainActivity的onResume
+0

https://developer.android.com/guide/components/fragments.html#Lifecycle –

+0

该链接与我的相同。它声明片段onActivityCreated在Activity onStart之前被调用,但我的日志语句显示它在 – user3148156

回答

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()

+0

谢谢之后调用,它确实打印了它。 https://github.com/xxv/android-lifecycle显示onActivityCreated在Activity onStart之前调用,是一个错误还是我误解了图表? – user3148156

相关问题