2017-08-15 63 views
0

我在我的应用程序中使用recyclerview。我想在点击图片视图时启动一个片段。但我不知道如何。另外我想把数据,当开始片段。我知道如何用下面的代码开始活动。但我怎样才能以相同的方式开始片段?如何从onClick开始片段

编辑代码

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.layoutContent, frag); 
    ft.commit(); 
+0

我已经编辑我的代码。但正如在那里提到的,我不会尝试从另一个活动中替换片段。 – Ch4t4r

回答

0

片段不能启动,必须​​将它们添加到容器中。
片段并不是要独立运作,他们需要一个封闭的活动。

具有以下布局:

[...] 
    <FrameLayout android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="?android:attr/detailsElementBackground" /> 
    [...] 

您将片段像这样:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.container, newFragment); 
transaction.commit(); 

您可以通过使用捆绑并创建片段参数传递给片段如下:

TestFragment newFragment = new TestFragment(); 
Bundle args = new Bundle(); 
args.putString("Hello world!"); 
newFragment.setArguments(args); 

这必须在交易之前完成。

如需进一步信息请参考上编辑代码official documentation



注意:您必须从活动中的FrameLayout是一部分内部调用事务。
或者使用比较脏的解决方法: 在主营:

public class Main extends Activity{ 
    public static Main currentInstance; 

    public void onCreate(Bundle boomerang){ 
    currentInstance = this; 
    } 
} 

播放列表中的活动,然后使用Main.currentInstance.getSupportFragmentManager()
但我不会推荐它。

+0

好的,我还有一个问题。我想从播放列表中启动一个片段,但该片段位于主要活动中。如果我使用FragmentTransaction,它会给出错误信息“没有找到用于片段ID的视图” –

+0

请问您可以在您的问题中发布当前代码吗?你的Fragment是否在'public static class NameOfFragment'中? – Ch4t4r

+0

我已经更新了代码,错误是由于主要布局中的layoutContent。我试图从playlistdetails活动中改变它。 –

0

为了启动一个片段,你需要使用片段管理器。

YourFragment yourFragmentInstance = YourFragment.newInstance("Hello", 12); 
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
//Fragment is hosted by an activity, and the activity must have a layout 
//or a container for the fragment to be nested in, in this case it will be 
//a FrameLayout with an id fragment_container 
fragmentTransaction.replace(R.id.fragment_container, yourFragmentInstance); 
fragmentTransaction.commit(); 

而且你可以在参数传递给您的片段是这样的:

public class YourFragment extends Fragment { 

    public static YourFragment newInstance(String paramOne, int paramTwo) { 
     YourFragment fragment = new YourFragment(); 
     Bundle b = new Bundle(); 
     //set params/arguments for fragment 
     b.putString("param_one", paramOne); 
     b.putInt("param_two", paramTwo); 
     fragment.setArguments(b); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Get the params you passed in 
     Bundle bundle = getArguments(); 
     String paramOne = bundle.getString("param_one"); 
     String paramTwo = bundle.getInt("param_two"); 
    } 
} 

注:我没有测试此代码。这只是一个想法:)