【问题标题】:Pass value from activity to Fragment getItem(int position)将值从活动传递到片段 getItem(int position)
【发布时间】:2016-11-01 13:57:43
【问题描述】:

如果这个问题不恰当,我很抱歉,但我需要一些帮助。我有一个 3-tabs 应用程序,打开应用程序时会查看第一个选项卡。

目的:注册后,用户将在第三个标签中查看他们的个人资料。

我做了什么:在RegisterActivity中,我在bundle中设置了一个值,它将传递给MainActivity

Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
intent.putExtra("profile", 2);
intent.putExtra("from", "register");

所以在MainActivity

profile = getIntent().getExtras().getInt("profile");
from = getIntent().getExtras().getString("from");

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(profile);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

我设法从RegisterActivity 获取值,但我不知道应该将int profile 值放在哪里。我希望将值传递给PagerAdapter 中的getItem 方法。

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            SearchGroupsFragment searchGroupsFragment = new SearchGroupsFragment();
            return searchGroupsFragment;
        case 1:
            RegisterGroupFragment registerGroupFragment = new RegisterGroupFragment();
            return registerGroupFragment;
        case 2:
            ProfileFragment profileFragment = new ProfileFragment();
            return profileFragment;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}

}

这样当用户注册成功后,他们会直接查看第三个标签。或者有什么其他方式可以查看?

谢谢。

编辑

我按照下面的答案并设法得到我想要的 - 在RegisterActivity 之后,我得到的视图是第三个选项卡及其布局。但是当我移动到第二个或第一个选项卡时,布局不会改变。选项卡更改没有动画或移动。简而言之,第三个选项卡的布局“卡住”了,第二个和第一个选项卡的布局没有改变。

【问题讨论】:

    标签: android android-fragments android-viewpager android-toolbar android-tablayout


    【解决方案1】:

    我建议您将这部分代码移动到您的 MainActivity OnCreate

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    

    像这样开始你的RegisterActivity

    Intent intent = new Intent(this, RegisterActivity.class);
    startActivityForResult(intent, 1001);
    

    RegisterActivity中,像这样将结果返回给MainActivity

    Intent intent = new Intent();
    intent.putExtra("profile", 2);
    intent.putExtra("from", "register");
    setResult(Activity.RESULT_OK, intent);
    finish();
    

    MainActivity 中,覆盖 onActivityResult

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1001 && resultCode == RESULT_OK){
            int profile = data.getExtras().getInt("profile");
            String from = data.getExtras().getString("from");
            viewPager.setCurrentItem(profile)
        }
    }
    

    【讨论】:

    • 意思是把onTabSelected留空?
    • 是的。 更新答案
    • 所有 3 个选项卡现在具有相同的片段布局
    • 你是从 MainActivity 启动 RegisterActivity 吗?
    • 来自 MainActivity 中的片段(相同的配置文件选项卡)
    【解决方案2】:

    您可以使用

    将 viewpager 移动到特定页面
    viewPager.setCurrentItem(index or position of page);
    

    注意:在viewPager.setAapter()之后调用该方法;

    祝福。

    【讨论】:

    • 奇怪.. 现在所有 3 个选项卡都有相同的片段,并且选定的选项卡是第一个,而不是第三个
    • 我删除了 viewPager.addOnPageChangeListenertabLayout.setOnTabSelectedListener
    • 如果您想在视图寻呼机更改时收听,您应该使用
    • 否则当您想将视图分页器移动到特定页面时,您调用此方法并传递页面的位置,在这种情况下,当视图分页器位于位置 2 时调用配置文件片段。所以您需要调用 viewPager.setCurrentItem(2);用于将 viewpager 移动到配置文件片段。 viewpager 的监听器仅在您想对特定页面进行一些更改时使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多