如何从活动到片段

时间:2016-02-12 08:38:27

标签: java android android-fragments android-intent

我知道这个问题已被多次询问,但我似乎无法找到问题的答案。

我试过这篇文章的解决方案: How to go to fragment from activity如下所示:

  

您需要创建一个扩展FragmentActivity并启动的类   你的片段

public class MessagesFragmentActivity extends SherlockFragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null){
            getSupportFragmentManager().beginTransaction()
                    .add(android.R.id.content, new MessagesFragment ()).commit();}
    }
}
  

你的片段构造函数。

public YourFragment() {
}
  

然后从你调用活动,开始你的片段活动   正常的方式

Intent i = new Intent(YourActivity.this,MessagesFragment.class);
startActivity(i);

但它对我不起作用,因为我的活动扩展了AppCompatActivity,因此我无法扩展FragmentActivity。

在这种情况下,我尝试创建一个新的活动,扩展FragmentActivity并将意图链接到这个新活动,然后这个新活动将转移到该片段。

以下是我的代码:

在我的活动中:

saveBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listName.getText().toString().equals("")) {
                    listName.requestFocus();
                    listName.setError("Required field");
                } else {
                    if (listOwner.getText().toString().equals("")) {
                        listOwner.requestFocus();
                        listOwner.setError("Required field");
                    } else {
                        params.add(new BasicNameValuePair("userID", userid));
                        params.add(new BasicNameValuePair("Name", listName
                                .getText().toString()));
                        params.add(new BasicNameValuePair("OwnerName",
                                listOwner.getText().toString()));
                        params.add(new BasicNameValuePair("CompanyName",
                                companyName.getText().toString()));
                        params.add(new BasicNameValuePair("CompanyAddress",
                                companyAddress.getText().toString()));
                        params.add(new BasicNameValuePair("CompanyPhone",
                                companyNumber.getText().toString()));

                        for (int d = 0; d < CustomFieldsList.size(); d++) {
                            CustomFields field = CustomFieldsList.get(d);
                            CheckBox cb = (CheckBox) findViewById(field
                                    .getFieldID());
                            if (cb.isChecked()) {
                                checkboxChecked.add(Integer.toString(field
                                        .getFieldID()));
                            }
                        }

                        new SaveContact().execute();
                        Intent back = new Intent(AddContactListActivityOCR.this, Revert.class);
                        startActivity(back);
                        finish();
                    }

在我的新活动(Revert.java)中:

public class Revert extends FragmentActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null){
            getSupportFragmentManager().beginTransaction()
                    .add(android.R.id.content, new FragmentContactLists()).commit();}
    }

}

但是,它在这里显示以下错误: enter image description here

出了什么问题?

------------------------------------- EDIT ------ --------------------------------

尝试@saeed回答后:

它导致以下内容: enter image description here enter image description here

虽然我导入了“android.support.v4.app.Fragment;”,但它仍然显示此错误。

5 个答案:

答案 0 :(得分:0)

试试这个: 在你的碎片上:

 public static MyFragment createFragment() {
        MyFragment fragment = new MyFragment();
        return fragment;
    }

关于您的活动:

mFragment = MyFragment.createFragment();

       getSupportFragmentManager().beginTransaction().add(
            R.id.fragment_container,
            mFragment).commit();

答案 1 :(得分:0)

试试这个。这对我有用。

并确保您有导入V4片段。 使用替换而不是添加。

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_content_id, new SubscriptionFragment(), "")
                      .addToBackStack(null).commit();

答案 2 :(得分:0)

你的活动xml中你应该有一个framelayout你想要使用片段,id是framelayout到@ + id / content ..并且替换&#34; android.R.id.content&#34;在您的代码中R.id.content。 这应该可以解决问题。

答案 3 :(得分:0)

您请替换此代码

       getSupportFragmentManager().beginTransaction()
  .add(android.R.id.content, new new FragmentContactLists()).commit();

getSupportFragmentManager().beginTransaction()
 .replace(R.id.container, new new FragmentContactLists()).commit();

你可以像这样替换actyity布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container">

</FrameLayout>

在FragmentContactList中导入android.app.Fragment。将其更改为导入android.support.v4.app.Fragment;

答案 4 :(得分:0)

Fragment mRideHistory = new fragmentAny();
        getFragmentManager().beginTransaction().replace(R.id.content_frame, mRideHistory)
                .addToBackStack(getPackageName()).commit();

这是片段活动的正确格式。 在需要添加此项的任何地方使用getActivity。 我希望这些信息对您有所帮助。