Java 如何打开或启动另一活动的片段?

Java 如何打开或启动另一活动的片段?,java,android,android-fragments,android-intent,android-activity,Java,Android,Android Fragments,Android Intent,Android Activity,从活动中包含的RecyclerView的适配器中,我尝试在按下RecyclerView的元素时启动一个片段,这是我现在的代码: @Override public void onClick(View v) { Intent intent; int position = getAdapterPosition(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(co

从活动中包含的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);
我启动片段是因为它是一个活动,所以当我运行应用程序时,它会崩溃,并告诉我在清单中将MainFragment声明为一个活动

如何从我的活动中启动该片段


非常感谢。

您不能用
意图启动
片段
,因此我向您推荐的方法是:

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

有关详细信息,请参见您不能使用
意图启动
片段。意图提供活动之间的沟通

如果要从其他
片段
启动
片段
,有两个选项

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

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
                .replace( R.id.content_frame, fragment )
                .addToBackStack( null )
                .commit();
在本例中,活动有两个片段


2-您可以启动一个包含片段的新活动。

如果您使用的是Sections寻呼机适配器,简单的做法是使用图像视图上的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类如下所示(单独的公共类)

公共类节SpagerAdapter扩展了FragmentPagerAdapter{
私有列表MFFragmentList=newArrayList();
公共部分SpagerAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
公共片段getItem(int i){
返回mffragmentlist.get(i);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
公共void addFragment(片段片段){
添加(片段);
}
}
您的中心视图寻呼机布局为

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

包含在另一个类似这样的文件中(或不包含-在我的例子中,它包含在内)



这将把您从一个活动直接带到一个片段(在另一个活动中),或者从一个活动中的片段带到另一个活动中的片段…

非常感谢,但是什么是getSupportFragmentManager()和R.id.content\u frame,MFFragment?您使用的是v4Fragment吗?content frame是您的片段中的内容,我是,但我仍然无法使用getSupportFragmentManager()方法:(请删除支持,尝试使用
getFragmentManager()
抱歉,尝试使用
context.getSupportFragmentManager())
?无论如何,你必须先调用上下文。我不想从另一个片段中启动一个片段,我想从一个活动中启动一个片段。@MustafaOlkun是的,但如何准确地做到这一点?
<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" />