【问题标题】:How to open or launch a Fragment from another Activity?如何从另一个 Activity 打开或启动 Fragment?
【发布时间】:2015-09-13 19:37:25
【问题描述】:

从包含在 Activity 中的 RecyclerView 的适配器,我试图在按下 RecyclerView 的元素时启动一个片段,这是我现在的代码:

@Override
public void onClick(View v) {
    Intent intent;

    int position = getAdapterPosition();

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    String onoff = preferences.getString("it's", "");

    if (onoff.equalsIgnoreCase("on")) {
        if (position == 0) {

            CategoriesRecyclerView.fragSubreddit = "aww";

            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 1) {

            CategoriesRecyclerView.fragSubreddit = "food";

            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 2) {

            CategoriesRecyclerView.fragSubreddit = "funny";

            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 3) {

            CategoriesRecyclerView.fragSubreddit = "gaming";

            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

    } else if (onoff.equalsIgnoreCase("off")) {

        if (position == 0) {

            CategoriesRecyclerView.fragSubreddit = "gaming";
            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 1) {

            CategoriesRecyclerView.fragSubreddit = "funny";
            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 2) {

            CategoriesRecyclerView.fragSubreddit = "food";
            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }

        if (position == 3) {

            CategoriesRecyclerView.fragSubreddit = "aww";
            intent = new Intent(context, MainFragment.class);
            context.startActivity(intent);
        }
    }
}

我测试了它启动我创建的一些“测试活动”,所以我知道除了片段启动之外的一切都很好。

错误在这里:

intent = new Intent(context, MainFragment.class);
context.startActivity(intent);

我正在启动 Fragment,因为它是一个 Activity,所以当我运行应用程序时它会崩溃并告诉我在清单中将 MainFragment 声明为一个 Activity。

如何从我的 Activity 中启动该 Fragment?

非常感谢。

【问题讨论】:

    标签: java android android-fragments android-intent android-activity


    【解决方案1】:

    你不能用Intents开始Fragment所以我推荐给你的方法是:

    Fragment mFragment = null;
    mFragment = new MainFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
    

    欲了解更多信息,请参阅Fragments Transactions documents

    【讨论】:

    • 非常感谢,但是 getSupportFragmentManager() 和 R.id.content_frame, mFragment 是什么?
    • 您在使用 v4Fragment 吗?内容框架是您的 Fragment 中的内容
    • 我是,但我仍然无法使用方法 getSupportFragmentManager() :(
    • 删除支持尝试getFragmentManager()
    • 抱歉尝试了context.getSupportFragmentManager()?不知何故,你必须先调用你的上下文。
    【解决方案2】:

    您不能使用Intents 启动Fragment。意图提供活动之间的通信。

    如果您想从其他Fragment 启动Fragment,您有两种选择。

    1- 您可以替换或添加新片段。

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction
                    .replace( R.id.content_frame, fragment )
                    .addToBackStack( null )
                    .commit();
    

    在这种情况下,活动有两个片段。

    2- 您可以启动一个包含 Fragment 的新 Activity。

    【讨论】:

    • 我不想为另一个片段中的片段加星标,我想为活动中的片段加星标。
    • @MustafaOlkun 是的,但是如何准确地做到这一点?
    【解决方案3】:

    如果您使用的是 Sections Pager Adapter,那么简单的做法是在图像视图或按钮上使用 onclick,如下所示:

    在您的起始活动中(从您想去的地方)使用 put extra 将一些信息发送到另一个活动

    ivPhotoAlbums.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            // Send The Message Receiver ID & Name
            Intent intent = new Intent(v.getContext(), PhotosActivity.class);
            intent.putExtra("viewpager_position", 1);
            v.getContext().startActivity(intent);
    
        }
    });
    

    在您想要登陆的活动中(在 setupViewPager() 函数的末尾)捕获该额外内容并将其用作位置

    int position = 0;
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        position = extras.getInt("viewpager_position");
    }
    viewPager.setCurrentItem(position);
    

    假设您的 setupViewPager() 函数在您的目标活动中如下所示

    SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
    adapter.addFragment(new FriendsAlbumsFragment()); //index 0
    adapter.addFragment(new MyAlbumsFragment()); //index 1
    adapter.addFragment(new AddPhotosFragment()); //index 2
    
    final ViewPager viewPager = findViewById(R.id.l_center_view_pager_view_pager);
    viewPager.setAdapter(adapter);
    
    TabLayout tabLayout = findViewById(R.id.l_top_tabs_tabs);
    
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.getTabAt(0).setIcon(R.drawable.ic_friends_photos);
    tabLayout.getTabAt(1).setIcon(R.drawable.ic_my_photos);
    tabLayout.getTabAt(2).setIcon(R.drawable.ic_add_photos);
    

    您的 SectionsPagerAdapter 类如下所示(单独的公共类)

    public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
        private List<Fragment> mFragmentList = new ArrayList<>();
    
        public SectionsPagerAdapter(FragmentManager fm) {
    
            super(fm);
    
        }
    
        @Override
        public Fragment getItem(int i) {
    
            return mFragmentList.get(i);
        }
    
        @Override
        public int getCount() {
    
            return mFragmentList.size();
        }
    
        public void addFragment(Fragment fragment) {
    
            mFragmentList.add(fragment);
        }
    }
    

    您的中心视图寻呼机布局是

    <merge xmlns:android="http://schemas.android.com/apk/res/android">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/l_center_view_pager_view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="56dp">
    
        </android.support.v4.view.ViewPager>
    
    </merge>
    

    包含在这样的另一个文件中(或不包含 - 在我的情况下它被包含)

    <include layout="@layout/layout_center_viewpager" />
    

    这会将您从一个活动直接带到一个片段(在另一个活动中)或从一个活动中的片段到另一个活动中的片段...

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 2016-12-19
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多