题 在片段视图之间切换


在xml布局文件中声明片段的标准方法是

<LinearLayout ...> 
    <fragment class="com.example.SomeFragment"
</LinearLayout>

其中SomeFragment是一个定义的java类

class SomeFragment extends Fragment { 
    ... 
}

可以说,我有3个片段; fragment1,fragment2和fragment3。当用户启动应用程序时,我将它们显示为fragment1,当他们点击按钮时,我将fragment1替换为fragment2等。

在单个布局xml文件中定义3个片段的最佳方法是什么?


32
2017-10-17 12:14


起源




答案:


您应该使用FrameLayout,这样您就不必在XML中指定片段类,并且不限于一个类。

<FrameLayout 
    android:id="@+id/contentFragment"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" />

而且你可以像这样在代码中设置片段

Fragment fragment = new YourFragment();

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.contentFragment, fragment);
transaction.commit();

53
2017-10-17 12:20



如果一个人不想在代码中创建片段怎么办:Fragment fragment = new YourFragment();但只能在xml布局中才能在片段之间切换? - 2cupsOfTech
我唯一可以想象的是你只需添加它们并设置一个 android:visibility="false" 但是我认为在代码中执行它是一种更好的方法 - Mats Hofman
@ 2cupsOfTech Fragments 应该在代码中完成 FragmentManger 管理,并可以设置转换动画,您可以将事务添加到回溯。你可以使用 FragmentPagerAdapter 用一个 ViewPager 在页面之间切换 Fragments。 - Dandre Allison


我举一个例子来在片段中的两个布局之间切换:

首先声明一个包含两个片段的布局:(这取决于您在布局中需要多少片段)

fragment_layout_example.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

     <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/Fragment2"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"
        class="com.example.SecondFragment" >

        <!-- Preview: layout=@layout/details -->
    </fragment>
</LinearLayout>

上面的布局将显示两个片段Fragment1和Fragment2。 对于Fragment1,我已经声明了容器,因为容器的内容将在运行时更改。所以没有宣布 Fragment 这里上课。有关此检查的更多信息

http://developer.android.com/training/basics/fragments/fragment-ui.html

然后创建一个扩展的FragmentExampleActivity类 Activity。如果您在向后兼容模式下使用Fragment,则扩展 FragmentActivity

  public class FragmentExampleActivity extends FragmentActivity{

@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_layout_example);

     // Check that the activity is using the layout version with
    // the fragment_container FrameLayout
    if (findViewById(R.id.fragment_container) != null) {

        // However, if we're being restored from a previous state,
        // then we don't need to do anything and should return or else
        // we could end up with overlapping fragments.
        if (savedInstanceState != null) {
            return;
        }

        // Create an instance of Fragment1
        Fragment1 firstFragment = new Fragment1();

        // In case this activity was started with special instructions from an Intent,
        // pass the Intent's extras to the fragment as arguments
        firstFragment.setArguments(getIntent().getExtras());

        // Add the fragment to the 'fragment_container' FrameLayout
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();
    }
  }

 }

要为两个片段创建布局,请创建两个扩展的类 Fragment

public class Fagment1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //set the layout you want to display in First Fragment
    View view = inflater.inflate(R.layout.fragment1,
            container, false);
    return view;

}

}

同样的方法为第二个Fragment创建Fragment类并设置布局

现在如果你想在单击按钮时将Fragment1中的片段布局切换到另一个布局,然后创建另一个类,比如Fragment3.java并设置要切换的布局,并在Fragment1.java中写下面的代码

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button showFragment3=(Button)getView().findViewById(R.id.Button1);
    showFragment3.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager
                    .beginTransaction();

            Fragment3 fragment3 = new Fragment3();
            fragmentTransaction.replace(R.id.Fragment1, fragment3);
//provide the fragment ID of your first fragment which you have given in
//fragment_layout_example.xml file in place of first argument
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

        }
    });

}

现在再次回到第一个片段,您可以单击后退按钮。但是,如果您想再次点击按钮,请在Fragment3.java中编写以下代码

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button showFragment1 = (Button) getView().findViewById(
            R.id.Button2);
    showFragment1 .setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            getFragmentManager().popBackStack();
        }
    });

}

谢谢!希望它能帮到你......


18
2017-09-07 05:52



谢谢你的详细解释。这肯定会帮助那里的人。 - Raunak
希望有人能看到这一点,通过Google发现了这一点。类似的东西会用于类吗?我想在我的一个片段上有5个按钮,它们都会转到不同的片段。这是水平滚动系统的一部分,有没有办法包含动画呢?因此,当用户点击按钮时,它只会显示移动到所选片段的动画。感谢那些看到这个的人的建议! - RED_