如何从另一个Activity中打开或启动一个Fragment?

4

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

@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?

非常感谢。

3个回答

3

你不能使用Intents启动一个Fragment,所以我建议你使用以下方法:

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

更多信息请参考片段事务文档


非常感谢,但是getSupportFragmentManager()和R.id.content_frame、mFragment是什么? - Sebastian Delgado
你正在使用v4Fragment吗?content frame是来自你的Fragment的内容。 - Skizo-ozᴉʞS ツ
我是,但我仍然无法使用方法getSupportFragmentManager() :( - Sebastian Delgado
ن½؟用getFragmentManager()و›؟وچ¢Support tryم€‚ - Skizo-ozᴉʞS ツ
对不起,您尝试使用context.getSupportFragmentManager()吗?不管怎样,您必须先调用您的上下文。 - Skizo-ozᴉʞS ツ
让我们在聊天中继续这个讨论 - Sebastian Delgado

1
你不能使用意图(Intent)来启动一个片段(Fragment),意图提供了活动(Activity)之间的通信。
如果你想从另一个片段(Fragment)启动一个片段(Fragment),你有两个选择。
1- 你可以替换或添加一个新的片段。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
                .replace( R.id.content_frame, fragment )
                .addToBackStack( null )
                .commit();

在这种情况下,该活动有两个片段。
2- 您可以启动包含片段的新活动。

2
我不想从另一个片段启动片段,我想从活动中启动片段。 - Sebastian Delgado
2
@MustafaOlkun 是的,但具体怎么做呢? - drearypanoramic

0
如果您正在使用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" />

这将带您从一个活动直接跳转到另一个活动中的片段,或者从一个活动中的片段跳转到另一个活动中的片段...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接