如何从活动中启动片段

Sav*_*ita 9 android android-fragments

我已经想从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();
Run Code Online (Sandbox Code Playgroud)

我还想知道如何传递intent.setData并在Fragment中获取该数据.目前我有以下代码:

RecipientFragment

mMediaUri = getActivity().getIntent().getData();
Run Code Online (Sandbox Code Playgroud)

主要活动

Intent recipientsIntent = new Intent(this, RecipientsFragment.class);
        recipientsIntent.setData(mMediaUri);
Run Code Online (Sandbox Code Playgroud)

小智 34

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

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

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

替换片段做这个:

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

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

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

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

add()和replace()与Fragment的生命周期之间的区别

  • 如果您使用的是 Android X,则需要使用 `getSupportFragmentManager` 而不是 `getFragmentManager` (6认同)

Roh*_*ngh 8

另一个视图组:

片段是可以在活动中显示的视图组。但它需要一个容器。容器可以是任何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>
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

步骤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();
   }

}
Run Code Online (Sandbox Code Playgroud)

演示项目:

这是非常基本的代码。如果您想了解 Fragment 中的更多高级主题,则可以查看以下资源:

Woof - 以正确的方式学习片段
我的 Android Garage


小智 5

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

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


Sun*_*nil 5

简单的方法

  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();}
     }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您想打断电话的活动中

     Intent i = new Intent(Currentactivityname.this,ActivityName.class);
     startActivity(i);
    
    Run Code Online (Sandbox Code Playgroud)

另一种方法

  1. 在您要打开片段的活动中放置框架布局

      <FrameLayout
            android:id="@+id/frameLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </FrameLayout>
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    
    Run Code Online (Sandbox Code Playgroud)