ViewPager - 从 setOnTabSelectedListener 启动 Activity
ViewPager - Launch Activity from setOnTabSelectedListener
我试图让 activity 在选择特定选项卡时启动,但是当我从那个 activity return 时,我希望显示前一个而不是我点击的选项卡。就像您在 Instagram 上单击加号按钮一样。
像这样:
默认片段 1/标签 1
转到片段 5/选项卡 5
点击标签3,弹出activity
返回,查看 Fragment 5/Tab 5
现在,我将上次访问的选项卡索引存储在一个变量中,然后当单击选项卡 3 时,它只会转到上次访问的选项卡。
tabLayout.setOnTabSelectedListener(
new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//super.onTabSelected(tab); -- Should keep this or leave it commented out?
int pos = tab.getPosition();
switch (pos) {
case 0:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Home");
pre_pos = pos;
pre_title = "Home";
break;
case 1:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Trending");
pre_pos = pos;
pre_title = "Trending";
break;
case 2:
viewPager.setCurrentItem(pre_pos, false);
getSupportActionBar().setTitle(pre_title);
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
startActivity(intent);
Toast.makeText(getApplicationContext(),
"Curr: "+ viewPager.getCurrentItem()+
" Prev: " + pre_pos +
" Clicked: " +tab.getPosition(),
Toast.LENGTH_SHORT).show();
break;
case 3:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Notifications");
pre_pos = pos;
pre_title = "Notifications";
break;
case 4:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Profile");
pre_pos = pos;
pre_title = "Profile";
break;
}
}
});
在ViwPager.java
中它在调用setCurrentItem()
时调用这个函数
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
if (mAdapter == null || mAdapter.getCount() <= 0) {
setScrollingCacheEnabled(false);
return;
}
//I think my problem lies in the following line (mCurItem == item)
if (!always && mCurItem == item && mItems.size() != 0) {
setScrollingCacheEnabled(false);
return;
}
if (item < 0) {
item = 0;
} else if (item >= mAdapter.getCount()) {
item = mAdapter.getCount() - 1;
}
final int pageLimit = mOffscreenPageLimit;
if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
// We are doing a jump by more than one page. To avoid
// glitches, we want to keep all current pages in the view
// until the scroll ends.
for (int i = 0; i < mItems.size(); i++) {
mItems.get(i).scrolling = true;
}
}
final boolean dispatchSelected = mCurItem != item;
if (mFirstLayout) {
// We don't have any idea how big we are yet and shouldn't have any pages either.
// Just set things up and let the pending layout handle things.
mCurItem = item;
if (dispatchSelected) {
dispatchOnPageSelected(item);
}
requestLayout();
} else {
populate(item);
scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}
}
我认为这是我的问题所在,但我无法编辑它。
有什么建议吗?
谢谢。
在 activity 上实施 ViewPager.OnPageChangeListener。在 viewpager
上设置侦听器
view_pager.setOnPageChangeListener(this);
在 OnPageSelected() 方法中:
@Override
public void onPageSelected(int position) {
if (position == 3) {
startActivity(new Intent(this,activity.class));
}
}
覆盖 activity onResume 方法并写入:
@Override
public void onResume() {
super.onResume();
view_pager.setCurrentItem(0);
}
To do this You have to follow these Simple Steps
步骤:1 在所有 ViewPager Frgment
中覆盖以下方法
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
}
当您的片段可见时将调用此方法。
步骤:2 在 Fragmenr3 中设置一个条件,当您的片段变得可见时 Activity 开始新的
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if(menuVisible){
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
startActivity(intent);
}
}
现在它将打开你 activity 在前面。但是你的一个要求是,如果用户从 activity 返回,你必须显示第二个最后片段,所以你提到你正在存储最后片段的索引位置,所以按照下面的步骤。
步骤:3 在您的 ViewPager Actvity 中覆盖 onRestart()
@Override
protected void onRestart() {
super.onRestart();
view_pager.setCurrentItem(Stored last Index);
}
它会解决你的问题,它对我有用。
我试图让 activity 在选择特定选项卡时启动,但是当我从那个 activity return 时,我希望显示前一个而不是我点击的选项卡。就像您在 Instagram 上单击加号按钮一样。
像这样:
默认片段 1/标签 1
转到片段 5/选项卡 5
点击标签3,弹出activity
返回,查看 Fragment 5/Tab 5
现在,我将上次访问的选项卡索引存储在一个变量中,然后当单击选项卡 3 时,它只会转到上次访问的选项卡。
tabLayout.setOnTabSelectedListener(
new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//super.onTabSelected(tab); -- Should keep this or leave it commented out?
int pos = tab.getPosition();
switch (pos) {
case 0:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Home");
pre_pos = pos;
pre_title = "Home";
break;
case 1:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Trending");
pre_pos = pos;
pre_title = "Trending";
break;
case 2:
viewPager.setCurrentItem(pre_pos, false);
getSupportActionBar().setTitle(pre_title);
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
startActivity(intent);
Toast.makeText(getApplicationContext(),
"Curr: "+ viewPager.getCurrentItem()+
" Prev: " + pre_pos +
" Clicked: " +tab.getPosition(),
Toast.LENGTH_SHORT).show();
break;
case 3:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Notifications");
pre_pos = pos;
pre_title = "Notifications";
break;
case 4:
viewPager.setCurrentItem(tab.getPosition(), false);
getSupportActionBar().setTitle("Profile");
pre_pos = pos;
pre_title = "Profile";
break;
}
}
});
在ViwPager.java
中它在调用setCurrentItem()
时调用这个函数
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
if (mAdapter == null || mAdapter.getCount() <= 0) {
setScrollingCacheEnabled(false);
return;
}
//I think my problem lies in the following line (mCurItem == item)
if (!always && mCurItem == item && mItems.size() != 0) {
setScrollingCacheEnabled(false);
return;
}
if (item < 0) {
item = 0;
} else if (item >= mAdapter.getCount()) {
item = mAdapter.getCount() - 1;
}
final int pageLimit = mOffscreenPageLimit;
if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
// We are doing a jump by more than one page. To avoid
// glitches, we want to keep all current pages in the view
// until the scroll ends.
for (int i = 0; i < mItems.size(); i++) {
mItems.get(i).scrolling = true;
}
}
final boolean dispatchSelected = mCurItem != item;
if (mFirstLayout) {
// We don't have any idea how big we are yet and shouldn't have any pages either.
// Just set things up and let the pending layout handle things.
mCurItem = item;
if (dispatchSelected) {
dispatchOnPageSelected(item);
}
requestLayout();
} else {
populate(item);
scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}
}
我认为这是我的问题所在,但我无法编辑它。 有什么建议吗?
谢谢。
在 activity 上实施 ViewPager.OnPageChangeListener。在 viewpager
上设置侦听器 view_pager.setOnPageChangeListener(this);
在 OnPageSelected() 方法中:
@Override
public void onPageSelected(int position) {
if (position == 3) {
startActivity(new Intent(this,activity.class));
}
}
覆盖 activity onResume 方法并写入:
@Override
public void onResume() {
super.onResume();
view_pager.setCurrentItem(0);
}
To do this You have to follow these Simple Steps
步骤:1 在所有 ViewPager Frgment
中覆盖以下方法 @Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
}
当您的片段可见时将调用此方法。
步骤:2 在 Fragmenr3 中设置一个条件,当您的片段变得可见时 Activity 开始新的
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if(menuVisible){
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
startActivity(intent);
}
}
现在它将打开你 activity 在前面。但是你的一个要求是,如果用户从 activity 返回,你必须显示第二个最后片段,所以你提到你正在存储最后片段的索引位置,所以按照下面的步骤。
步骤:3 在您的 ViewPager Actvity 中覆盖 onRestart()
@Override
protected void onRestart() {
super.onRestart();
view_pager.setCurrentItem(Stored last Index);
}
它会解决你的问题,它对我有用。