何时在此应用程序中调用 onCreateView()?
When does onCreateView() get called in this app?
我正在读一本 android 书,我遇到了一个关于 ViewPager 片段的应用程序。
我将在此处列出我有疑问的 3 classes:
FragmentActivity class:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class ViewPagerFragmentDemoActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewPager pager=findViewById(R.id.pager);
pager.setAdapter(new SampleAdapter(getSupportFragmentManager()));
}
}
PagerAdapter:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class SampleAdapter extends FragmentPagerAdapter {
public SampleAdapter(FragmentManager mgr) {
super(mgr);
}
@Override
public int getCount() {
return(10);
}
@Override
public Fragment getItem(int position) {
return(EditorFragment.newInstance(position));
}
}
和片段 class:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
public class EditorFragment extends Fragment {
private static final String KEY_POSITION="position";
static EditorFragment newInstance(int position) {
EditorFragment frag=new EditorFragment();
Bundle args=new Bundle();
args.putInt(KEY_POSITION, position);
frag.setArguments(args);
return(frag);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View result=inflater.inflate(R.layout.editor, container, false);
EditText editor=result.findViewById(R.id.editor);
int position=getArguments().getInt(KEY_POSITION, -1);
editor.setHint(String.format(getString(R.string.hint), position + 1));
return(result);
}
}
我了解到,在 activity 中,我们将 SampleAdapter 注册为寻呼机的适配器,然后在适配器中,每次我们想要显示一个片段时,我们调用 getItem() 依次 return是一个要显示在屏幕上的 EditorFragment,这正是我在return这个片段的方法中遇到的问题。
由于此方法创建了一个 EditorFragment(),因此向片段添加了一些参数并 return 将片段添加到 getView()。那么 onCreateView() 何时被调用以及谁调用它?
(我尝试使用日志消息来跟踪程序,但无法推断出我的问题的答案。)。
编辑(详细说明我的问题,因为答案和评论都是我已经知道的):
"The user launches the app (let's say this app has only this ViewPagerFragmentDemoActivity), this activity's onCreate() is called,which sets the adapter,then for the first screen to appear,the getView() in the adapter class is called, which in turn calls newInstance() method of EditorFragment class, this method creates a fragment (using the constructor obviously) and adds some key-value to it using Bundle object and returns this fragment to the calling method(getView())."
1.Is这条线索是真的吗?
2.where是在调用onCreateView()吗?
3.What 发生在 Fragment 被 returned 到 getView() 之后?是在这个android 框架在 Fragment?
的这个对象上调用 onCreateView() 的时间
当片段需要创建其视图时,onCreateView
由 Android 框架调用。
在调用 onCreate() 之后(在 Fragment 中),系统调用 Fragment 的 onCreateView() 来创建它的视图,因此 fragment 的整个流程看起来像这样并且 oncreateview 会在期间被调用两次它的生命周期
在您的 Activity
完成其启动生命周期后(即 onResume()
之后),它将开始绘制到屏幕上。 Android 将视图绘制到屏幕上的确切方式比在这里值得一提的要复杂得多,但是会进行一次测量以弄清楚所有内容有多大。
该测量过程将调用 ViewPager.onMeasure()
,后者将调用 ViewPager.populate()
以了解 ViewPager
有多大。
首先,populate()
将调用 ViewPager.addNewItem()
,后者将调用 FragmentPagerAdapter.instantiateItem()
。该方法做两件事:(1) 启动一个 FragmentTransaction
和 (2) 调用适配器的 getItem()
方法。 (这是对您的第三个问题的回答:仅从 getItem()
返回一个 Fragment 并没有做任何事情……但是。)
接下来,populate()
将调用 FragmentPagerAdapter.finishUpdate()
。此方法将在上面创建的 FragmentTransaction
上调用 commitNowAllowingStateLoss()
。因为它提交 "now"(而不是异步),这将启动您的片段。
FragmentManager
处理执行此 FragmentTransaction
。它最终会调用 FragmentManager.moveFragmentToExpectedState()
,后者最终会调用 Fragment.performCreateView()
.
现在我们到了答案的最后。 Fragment.performCreateView()
调用片段的 onCreateView()
方法。
这是一张显示整个调用堆栈的图片:
我正在读一本 android 书,我遇到了一个关于 ViewPager 片段的应用程序。 我将在此处列出我有疑问的 3 classes:
FragmentActivity class:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class ViewPagerFragmentDemoActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewPager pager=findViewById(R.id.pager);
pager.setAdapter(new SampleAdapter(getSupportFragmentManager()));
}
}
PagerAdapter:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class SampleAdapter extends FragmentPagerAdapter {
public SampleAdapter(FragmentManager mgr) {
super(mgr);
}
@Override
public int getCount() {
return(10);
}
@Override
public Fragment getItem(int position) {
return(EditorFragment.newInstance(position));
}
}
和片段 class:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
public class EditorFragment extends Fragment {
private static final String KEY_POSITION="position";
static EditorFragment newInstance(int position) {
EditorFragment frag=new EditorFragment();
Bundle args=new Bundle();
args.putInt(KEY_POSITION, position);
frag.setArguments(args);
return(frag);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View result=inflater.inflate(R.layout.editor, container, false);
EditText editor=result.findViewById(R.id.editor);
int position=getArguments().getInt(KEY_POSITION, -1);
editor.setHint(String.format(getString(R.string.hint), position + 1));
return(result);
}
}
我了解到,在 activity 中,我们将 SampleAdapter 注册为寻呼机的适配器,然后在适配器中,每次我们想要显示一个片段时,我们调用 getItem() 依次 return是一个要显示在屏幕上的 EditorFragment,这正是我在return这个片段的方法中遇到的问题。
由于此方法创建了一个 EditorFragment(),因此向片段添加了一些参数并 return 将片段添加到 getView()。那么 onCreateView() 何时被调用以及谁调用它?
(我尝试使用日志消息来跟踪程序,但无法推断出我的问题的答案。)。
编辑(详细说明我的问题,因为答案和评论都是我已经知道的):
"The user launches the app (let's say this app has only this ViewPagerFragmentDemoActivity), this activity's onCreate() is called,which sets the adapter,then for the first screen to appear,the getView() in the adapter class is called, which in turn calls newInstance() method of EditorFragment class, this method creates a fragment (using the constructor obviously) and adds some key-value to it using Bundle object and returns this fragment to the calling method(getView())."
1.Is这条线索是真的吗?
2.where是在调用onCreateView()吗?
3.What 发生在 Fragment 被 returned 到 getView() 之后?是在这个android 框架在 Fragment?
的这个对象上调用 onCreateView() 的时间onCreateView
由 Android 框架调用。
在调用 onCreate() 之后(在 Fragment 中),系统调用 Fragment 的 onCreateView() 来创建它的视图,因此 fragment 的整个流程看起来像这样并且 oncreateview 会在期间被调用两次它的生命周期
在您的 Activity
完成其启动生命周期后(即 onResume()
之后),它将开始绘制到屏幕上。 Android 将视图绘制到屏幕上的确切方式比在这里值得一提的要复杂得多,但是会进行一次测量以弄清楚所有内容有多大。
该测量过程将调用 ViewPager.onMeasure()
,后者将调用 ViewPager.populate()
以了解 ViewPager
有多大。
首先,populate()
将调用 ViewPager.addNewItem()
,后者将调用 FragmentPagerAdapter.instantiateItem()
。该方法做两件事:(1) 启动一个 FragmentTransaction
和 (2) 调用适配器的 getItem()
方法。 (这是对您的第三个问题的回答:仅从 getItem()
返回一个 Fragment 并没有做任何事情……但是。)
接下来,populate()
将调用 FragmentPagerAdapter.finishUpdate()
。此方法将在上面创建的 FragmentTransaction
上调用 commitNowAllowingStateLoss()
。因为它提交 "now"(而不是异步),这将启动您的片段。
FragmentManager
处理执行此 FragmentTransaction
。它最终会调用 FragmentManager.moveFragmentToExpectedState()
,后者最终会调用 Fragment.performCreateView()
.
现在我们到了答案的最后。 Fragment.performCreateView()
调用片段的 onCreateView()
方法。
这是一张显示整个调用堆栈的图片: