【问题标题】:How to start Fragment from an Activity如何从 Activity 启动 Fragment
【发布时间】:2016-03-19 09:47:56
【问题描述】:

我已经想从我的 MainActivity 启动我的 RecipientFragment 并将数据从我的 MainActivity 传递到 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 中获取该数据。目前我有以下代码:

收件人片段

mMediaUri = getActivity().getIntent().getData();

主活动

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

【问题讨论】:

标签: android android-fragments


【解决方案1】:

您可以在活动中添加或替换片段。在活动布局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();

请参阅adding a fragment to an activity 上的 Android 文档或以下有关 SO 的相关问题:

Difference between add(), replace(), and addToBackStack()

Basic difference between add() and replace() method of Fragment

Difference between add() & replace() with Fragment's lifecycle

【讨论】:

  • 如果你使用的是Android X,你需要使用getSupportFragmentManager而不是getFragmentManager
  • 您忘记添加 XML 文件中的 FrameLayout 应将“容器”设置为 id。
【解决方案2】:

简单的方法

  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>
    
  2. 将此代码粘贴到您要打开片段的位置

        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 的操作栏不可见!!
  • @PrajwalW 也许你的主题有问题,请仔细检查
【解决方案3】:

首先,您以意图启动活动和服务,您以片段事务启动片段。 其次,您的交易没有做任何事情。 将其更改为:

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

【讨论】:

    【解决方案4】:

    另一个视图组:

    片段是可以在活动中显示的视图组。但它需要一个容器。容器可以是任何Layout(FragmeLayout、LinearLayout等。没关系)。

    第 1 步:

    定义活动布局:

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

    第 3 步:

    创建片段类

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

    第 4 步:

    在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 - Learn the fragment right way
    My Android Garage

    【讨论】:

      【解决方案5】:

      如何在 Android Kotlin 中从 Activity 启动片段

      添加片段:

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

      Here is more on fragment manager: https://developer.android.com/guide/fragments/fragmentmanager

      【讨论】:

        【解决方案6】:

        为了实现这一点,最好设计片段构造来接收该数据并将该数据保存在其捆绑参数中。

           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();
        

        但是,数据类必须是可解析的或可序列化的。

        有关 Fragments 的完整信息和使用 Fragments 的最佳实践,请花一些时间阅读官方文档,它非常有用,至少是我的经验

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

        【讨论】:

          【解决方案7】:

          对于 kotlin,你可以这样做

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

          【讨论】:

            【解决方案8】:

            您可以启动 Activity 并在其上附加 RecipientsFragment,但您无法启动 Fragment

            【讨论】:

              猜你喜欢
              • 2016-12-19
              • 2015-08-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-20
              • 2012-02-03
              • 1970-01-01
              相关资源
              最近更新 更多