【问题标题】:Which Fragment opened the activity?哪个片段打开了活动?
【发布时间】:2017-09-30 13:58:10
【问题描述】:

我有一个 viewpager,它有 4 个片段,它们都有 recyclerview。点击recyclerview,所有四个片段都打开同一个活动,即DemoActivity。我想在 DemoActivity 中显示不同的选项菜单,根据点击了 Fragmnet 的回收视图。我怎么会知道点击了哪个片段的回收视图并在 DemoActivity 中显示适当的选项菜单?

  public class CategoryAdapter extends FragmentPagerAdapter {
    private Context context;
    public CategoryAdapter(Context context,FragmentManager fm) {
        super(fm);
        this.context=context;
    }

    @Override
    public Fragment getItem(int position) {
        if(position==0){
            return new MyMoviesFragment();
        }
        else if(position==1){
            return new PopularFragment();
        }
        else if (position==2){
            return new UpComingFragment();
        }
        else{
            return new NowPlayingFragment();
        }

    }



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

    @Override
    public CharSequence getPageTitle(int position) {
        if(position==0){
            return context.getString(R.string.category_MyMovies);
        }
        else if(position==1){
            return context.getString(R.string.category_Popular);
        }

        else if(position==2){
            return context.getString(R.string.category_Upcoming);
        }
        else if(position==3){
            return context.getString(R.string.category_NowPlaying);
        }

        return super.getPageTitle(position);
    }
}

问题已编辑

【问题讨论】:

  • 你可以通过意图传递价值。可以分享一下代码吗?
  • 代码很长
  • 不确定这是否适用于 Fragments,但请尝试 referrer.getHost()
  • @MehmetKologlu 什么是referrer。如何创建它的对象?
  • 更正:ActivityCompat.getReferrer(this).getHost() 这是您的活动。或者也许你可以只使用引荐来源网址,而不是主机,真的不知道。

标签: android android-activity android-viewpager fragment android-optionsmenu


【解决方案1】:
in fragment (u can put this code inside your recycler view action listener )
Intent intent = new Intent(getActivity(), DemoActivity.class);
intent.putExtra("KEY", "UR_FRAGMENT_NAME");
startActivity(intent);

in DemoActivity inside onCreate() method
Intent intent  = getIntent();
if(intent.hasExtra("KEY")) {
   if(intent.getStringExtra("KEY").equals("UR_FRAGMENT_NAME")) {
     // todo what u want.
   }
}

【讨论】:

  • 但是点击事件是在 Adapter 类中处理的,并且所有四个片段都有相同的 Adapter 类
  • 在创建构造函数时只需在您的适配器内传递当前片段上的实例。 UrAdapter 适配器 = new UrAdapter(Fragment 片段);
  • 但是在我的适配器的构造函数中,我正在传递属于活动的上下文,并且所有片段都共享 MainActivity
  • UrAdapter 适配器 = new UrAdapter(Fragment 片段);在您使用上下文的适配器内部将其替换为上下文替换它 fragment.getActivity() 内部适配器操作检查 if(fragment instanceof UR_FRAGMENT_ONE) { Intent intent = new Intent(getActivity(), DemoActivity.class); intent.putExtra("KEY", "UR_FRAGMENT_NAME");开始活动(意图); } else if(fragment instanceof UR_FRAGMENT_TWO) { Intent intent = new Intent(getActivity(), DemoActivity.class); intent.putExtra("KEY", "UR_FRAGMENT_NAME");开始活动(意图); }
【解决方案2】:

如果您有ViewPager - 您可以使用一个职位选项。将您的fragment 的位置传递给您的DemoActivity.java

为此,您必须从FragmentPagerAdpatergetItem(int position) 方法传递位置,并将位置从Fragment 传递给Activity

就像 -

@Override
public Fragment getItem(int position) {
    Fragment mF;
    if (position == 0) {
       mF = new MyMoviesFragment();
    } else if (position==1){
       mF = new PopularFragment();
    } else if (position==2){
       mF = new UpComingFragment();
    } else {
       mF = new NowPlayingFragment();
    }
    Bundle b = new Bundle();
    b.putInt("KEY", position); // You are passing position to fragment
    mF.setArguments(b);
    return mF;
}

现在使用getArguments() 方法在您的fragment 中获得位置。例如,在您的MyMoviesFragment -

Bundle b = getArguements();
int position = b.getInt("KEY");

您已经在Fragment 中获得了职位,现在通过点击recyclerview 项目将其传递给Activity -

Intent i = new Intent(context, DemoActivity.class);
i.putExtra("NEW_KEY", position); // position is being passed to activity, retrieve in Activity using getExtras() and use it as needed.
startActivity(i);

你已经完成了!

【讨论】:

  • 您能告诉我如何将职位条件放入您的 DemoActivity.java。
  • 好吧,先告诉我——你在Fragment有职位吗?如果是,你能得到recycleview项目点击的事件吗?
  • 是的,我在 Fragment 中有位置,但如何检索它。public class CategoryAdapter extends FragmentPagerAdapter { private Context context;公共 CategoryAdapter(Context context,FragmentManager fm) { super(fm); this.context=上下文; } @Override public Fragment getItem(int position) { if(position==0){ return new MyMoviesFragment(); } else if(position==1){ return new PopularFragment()}else if (position==2){return new UpComingFragment(); }else{return new NowPlayingFragment();}} ......}
  • 发布您的代码并在您的问题中进行编辑,而不是在评论中发布。这是不可读的。
  • 我已经更新了答案。添加了一些sn-ps,看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多