如何从onClick启动片段

时间:2017-08-15 12:07:14

标签: android onclick fragment

我在我的应用中使用了recyclerview。我想在点击图片视图时启动一个片段。但我不知道该怎么做。我也想在启动片段时放入数据。我知道如何使用以下代码启动活动。但是我怎么能以相同的方式开始片段?

已编辑的代码

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

2 个答案:

答案 0 :(得分: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();

通过使用Bundle并按如下方式创建片段,将参数传递给片段:

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

这必须在交易之前完成。

有关详细信息,请参阅official documentation



关于已编辑代码的注意事项:您必须从FrameLayout所属的Activity内部调用事务。
或者使用相当脏的解决方法: 在Main:

public class Main extends Activity{
  public static Main currentInstance;

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

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

答案 1 :(得分: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");
    }
}

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