Activity 可见片段未正确记录
Activity and visible Fragment not logging properly
立即了解 Activity 和 Fragment。我创建了一个超级简单的应用程序,用于记录正在显示的 Fragment 以及我看到它的次数。这就是事情变得奇怪的地方......
我的理解是,如果一个特定的 Fragment 是可见的,那么它自己的 logcat 我在那个 Fragment 中应该出现。但事实并非如此,它似乎记录了其他Fragment的logcat或什么都没有。
当我加载我的应用程序时,它会自动显示 "tab1" 和 "tab2" 立即被记录。这让我感到困惑,因为我不知道为什么 "tab2" 会被调用,因为 "tab1" 是屏幕上唯一可见的片段。另外,为什么 "tab3" 没有被记录下来?当我向右滚动一次(到 "tab2")时,"tab3" 被记录。当我滚动到 "tab3" 时,没有任何记录。当我返回 "tab2" 时,"tab1" 被记录...在片段之间来回切换,我再也没有看到 "tab2" 出现在我的 logcat 中。此外,似乎无论我实际在哪个片段上,都会调用相应的 logcat 。
如果能帮助解释这一点,我们将不胜感激!
这是我的 MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPageAdapter = new SectionsPageAdapater(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.viewContainer);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
setupViewPager(mViewPager);
}
private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapater adapter = new SectionsPageAdapater(getSupportFragmentManager());
adapter.addFragment(new Tab1(), "TAB1");
adapter.addFragment(new Tab2(), "TAB1");
adapter.addFragment(new Tab3(), "TAB1");
viewPager.setAdapter(adapter);
}
}
这是我的 Fragment1:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab1,container,false);
number ++;
Log.i("tab 1", "number: " + number);
return view;
}
这是我的 Fragment2:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab2,container,false);
number ++;
Log.i("tab 2", "number: " + number);
return view;
}
这是我的 Fragment3:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab3,container,false);
number ++;
Log.i("tab 3", "number: " + number);
return view;
}
这是我的 logcat:
I/tab 1: number: 1
I/tab 2: number: 1
I/tab 3: number: 1
I/tab 1: number: 2
I/tab 3: number: 2
I/tab 1: number: 3
I/tab 3: number: 3
I/tab 3: number: 4
I/tab 3: number: 5
I/tab 1: number: 4
I/tab 3: number: 6
I/tab 1: number: 5
I/tab 3: number: 7
ViewPager
组件默认创建显示在屏幕上的 Fragment
和相邻的
这是一种优化,您可以使用方法 setOffscreenPageLimit (int limit)
更改该行为。 Reference
尝试覆盖你的代码中的方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
}
else if (!isVisibleToUser){
Log.d("TAG","Fragment not Visible ");
}
}
立即了解 Activity 和 Fragment。我创建了一个超级简单的应用程序,用于记录正在显示的 Fragment 以及我看到它的次数。这就是事情变得奇怪的地方......
我的理解是,如果一个特定的 Fragment 是可见的,那么它自己的 logcat 我在那个 Fragment 中应该出现。但事实并非如此,它似乎记录了其他Fragment的logcat或什么都没有。
当我加载我的应用程序时,它会自动显示 "tab1" 和 "tab2" 立即被记录。这让我感到困惑,因为我不知道为什么 "tab2" 会被调用,因为 "tab1" 是屏幕上唯一可见的片段。另外,为什么 "tab3" 没有被记录下来?当我向右滚动一次(到 "tab2")时,"tab3" 被记录。当我滚动到 "tab3" 时,没有任何记录。当我返回 "tab2" 时,"tab1" 被记录...在片段之间来回切换,我再也没有看到 "tab2" 出现在我的 logcat 中。此外,似乎无论我实际在哪个片段上,都会调用相应的 logcat 。
如果能帮助解释这一点,我们将不胜感激!
这是我的 MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPageAdapter = new SectionsPageAdapater(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.viewContainer);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
setupViewPager(mViewPager);
}
private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapater adapter = new SectionsPageAdapater(getSupportFragmentManager());
adapter.addFragment(new Tab1(), "TAB1");
adapter.addFragment(new Tab2(), "TAB1");
adapter.addFragment(new Tab3(), "TAB1");
viewPager.setAdapter(adapter);
}
}
这是我的 Fragment1:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab1,container,false);
number ++;
Log.i("tab 1", "number: " + number);
return view;
}
这是我的 Fragment2:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab2,container,false);
number ++;
Log.i("tab 2", "number: " + number);
return view;
}
这是我的 Fragment3:
int number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab3,container,false);
number ++;
Log.i("tab 3", "number: " + number);
return view;
}
这是我的 logcat:
I/tab 1: number: 1
I/tab 2: number: 1
I/tab 3: number: 1
I/tab 1: number: 2
I/tab 3: number: 2
I/tab 1: number: 3
I/tab 3: number: 3
I/tab 3: number: 4
I/tab 3: number: 5
I/tab 1: number: 4
I/tab 3: number: 6
I/tab 1: number: 5
I/tab 3: number: 7
ViewPager
组件默认创建显示在屏幕上的 Fragment
和相邻的
这是一种优化,您可以使用方法 setOffscreenPageLimit (int limit)
更改该行为。 Reference
尝试覆盖你的代码中的方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
}
else if (!isVisibleToUser){
Log.d("TAG","Fragment not Visible ");
}
}