从 Activity 如何启动 Fragment

27

我希望能从我的MainActivity启动RecipientFragment并且从MainActivity向该Fragment传递数据。以下是我实现的代码,但该Fragment无法启动。

Bundle bundle = new Bundle();
bundle.putString(ParseConstants.KEY_FILE_TYPE, fileType);
RecipientsFragment keyfile = new RecipientsFragment();
keyfile.setArguments(bundle);
Fragment newFragment = new RecipientsFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.commit();
我也想知道如何通过intent.setData传递数据并在Fragment中获取它。目前我有以下代码:
RecipientFragment
mMediaUri = getActivity().getIntent().getData();

主活动

Intent recipientsIntent = new Intent(this, RecipientsFragment.class);
        recipientsIntent.setData(mMediaUri);

但是你没有在任何地方添加或替换片段的代码? - Nigam Patro
这是关于Android中Fragment的官方文档,从Fragment生命周期到片段实现的全面介绍。https://developer.android.com/guide/components/fragments - MILLION GASHAW
8个回答

56

您可以在活动中添加或替换片段。在活动布局的xml文件中创建一个FrameLayout

然后在您的活动中执行以下操作以添加片段:

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.container,YOUR_FRAGMENT_NAME,YOUR_FRAGMENT_STRING_TAG);
transaction.addToBackStack(null);
transaction.commit();

要替换片段,请执行以下操作:

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container,YOUR_FRAGMENT_NAME,YOUR_FRAGMENT_STRING_TAG);
transaction.addToBackStack(null);
transaction.commit();

请参阅Android文档中的将片段添加到活动中或在SO上关注相关问题:

add()、replace()和addToBackStack()之间的区别

Fragment的add()和replace()方法的基本区别

add()和replace()在Fragment的生命周期中的区别


9
如果您正在使用Android X,需要使用getSupportFragmentManager而不是getFragmentManager - FabioR
1
你忘记了在XML文件中的FrameLayout应该将"id"设置为"container"。 - Taslim Oseni

17

简单的方法

  1. 创建一个新的Java类

    public class ActivityName extends FragmentActivity {
    @Override
     public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        if (savedInstanceState == null){
        getSupportFragmentManager().beginTransaction()
                .add(android.R.id.content, new Fragment_name_which_you_wantto_open()).commit();}
     }
    }
    
  2. 在您想调用片段的活动中

     Intent i = new Intent(Currentactivityname.this,ActivityName.class);
     startActivity(i);
    

另一种方法

  1. 在您想要打开片段的活动中放置帧布局。

  <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </FrameLayout>
  • 将此代码粘贴到您想要打开片段的位置

        Fragment mFragment = null;
            mFragment = new Name_of_fragment_which_you_want_to_open();
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frameLayout, mFragment).commit();
    

  • 1
    我认为我们还应该在清单文件中定义第一种方式的类名。 - mehmet
    方法1中操作栏不可见!! - Prajwal Waingankar
    @PrajwalW 也许问题出在你的主题上,请仔细检查。 - Sunil

    7

    另一个ViewGroup:

    片段是可以在Activity中显示的ViewGroup,但它需要一个容器。容器可以是任何布局(如FragmeLayout、LinearLayout等),不重要。

    输入图像描述

    步骤1:

    定义Activity布局:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <FrameLayout
           android:id="@+id/fragmentHolder"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
        />
    </RelativeLayout>
    

    步骤2:

    定义片段布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">
        <EditText
           android:id="@+id/user"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
        <EditText
           android:id="@+id/password"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:inputType="textPassword"/>
        <Button
           android:id="@+id/login"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Login"/>
    </LinearLayout>
    

    步骤三:

    创建 Fragment 类

    public class LoginFragment extends Fragment {
    
    
        private Button login;
        private EditText username, password;
    
        public static LoginFragment getInstance(String username){
           Bundle bundle = new Bundle();
           bundle.putInt("USERNAME", username);
           LoginFragment fragment = new LoginFragment();
           fragment.setArguments(bundle);
           return fragment;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
           View view = inflater.inflate(R.layout.login_fragment, parent, false);
           login = view.findViewById(R.id.login);
           username = view.findViewById(R.id.user);
           password = view.findViewById(R.id.password);
           String name = getArguments().getInt("USERNAME");
           username.setText(username);
           return view;
        }
    
    }
    

    步骤四:

    在Activity中添加碎片

    public class ActivityB extends AppCompatActivity{
    
       private Fragment currentFragment;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
    
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
    
           currentFragment = LoginFragment.getInstance("Rohit");
           getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragmentHolder, currentFragment, "LOGIN_TAG")
                    .commit();
       }
    
    }
    

    示例项目:

    这段代码非常基础。如果您想学习更高级的Fragment主题,可以查看以下资源:

    Woof - 学习正确使用Fragment
    我的Android车库


    5

    首先,使用意图(Intent)启动Activities和Services,使用片段事务(Fragment Transactions)启动片段(Fragments)。 其次,您的事务(transaction)没有做任何操作。 将它改为如下所示:

    FragmentTransaction transaction = getFragmentManager();
        transaction.beginTransaction()
            .replace(R.layout.container, newFragment) //<---replace a view in your layout (id: container) with the newFragment 
            .commit();
    

    0
    为了实现这一点,最好设计片段构造来接收数据并将数据保存在其捆绑参数中。
       class FragmentA extends Fragment{
        public static FragmentA newInstance(YourDataClass data) {
    
                FragmentA f = new FragmentA();
                Bundle b = new Bundle();
                b.putString("data", data);
                f.setArguments(b);
    
                return f;
            }
        }
    

    为了从类中启动片段,您可以执行以下操作

     Fragment newFragment = FragmentA.newInstance(objectofyourclassdata);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    
    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);
    
    // Commit the transaction
    transaction.commit();
    

    然而,数据类必须是可序列化或可反序列化的。

    关于片段以及最佳实践的完整信息,请在官方文档上花一些时间,这非常有用,至少对我来说如此。

    https://developer.android.com/guide/components/fragments#java


    0

    对于 Kotlin,您可以这样做:

    val myFragment = WelcomeFragment() supportFragmentManager.beginTransaction().replace(R.id.fragment_containerID,myFragment).addToBackStack(null).commit()


    0

    如何在Android Kotlin中从Activity启动Fragment

    添加Fragment:

    val manager: FragmentManager = supportFragmentManager
    val transaction: FragmentTransaction = manager.beginTransaction()
    transaction.add(R.id.container,YOUR_FRAGMENT_NAME,YOUR_FRAGMENT_STRING_TAG)
    transaction.addToBackStack(null)
    transaction.commit()
    

    替换片段:

    val manager: FragmentManager = supportFragmentManager
    val transaction = manager.beginTransaction()
    transaction.replace(R.id.container, YOUR_FRAGMENT_NAME, YOUR_FRAGMENT_STRING_TAG)
    transaction.addToBackStack(null)
    transaction.commit()
    

    这里有更多关于片段管理器的信息:https://developer.android.com/guide/fragments/fragmentmanager


    -4
    你可以启动一个Activity并将RecipientsFragment附加到它上面,但是你不能启动Fragment。

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