【问题标题】:Switching between Fragment view在片段视图之间切换
【发布时间】:2011-10-17 12:14:35
【问题描述】:

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

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

其中 SomeFragment 是一个类似定义的 java 类

class SomeFragment extends Fragment { 
    ... 
}

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

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

【问题讨论】:

    标签: android android-layout android-fragments


    【解决方案1】:

    您应该为此使用 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();
    

    【讨论】:

    • 如果不想在代码中创建片段怎么办:片段片段 = new YourFragment();但只能在 xml 布局中并且能够在 Fragments 之间切换?
    • 我唯一能想到的是,您只需将它们都添加并使用android:visibility="false" 设置一个,但我认为在代码中这样做是一种更好的方法
    • @2cupsOfTech Fragments 应该在带有FragmentManger 的代码中完成,并且可以为过渡设置动画,并且您可以将事务添加到回溯。您可以使用FragmentPagerAdapter 和ViewPager 在Fragments 的页面之间切换。
    • 这很好用,而不是使用片段视图
    【解决方案2】:

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

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

    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

    然后创建一个扩展Activity 的类 FragmentExampleActivity。如果您在向后兼容模式下使用 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();
            }
        });
    
    }
    

    谢谢!希望对你有帮助...

    【讨论】:

    • 感谢您的详细解释。这肯定会帮助那里的人。
    • 希望有人会看到这个,通过谷歌发现这个。类似的事情是否适用于类?我想在我的一个片段上有 5 个按钮,它们都指向不同的片段。这都是水平滚动系统的一部分,有没有办法也包括动画?因此,当用户点击一个按钮时,它只会显示动画移动到选定的片段。感谢看到此内容的人的任何建议!
    【解决方案3】:

    在我的片段中,我创建了一个方法

    public void switchFragment(Fragment fragment){
       FragmentManager fm = getFragmentManager();
        fm.beginTransaction()
                .replace(R.id.fr_layout_merchant, fragment)
                .addToBackStack(null)
                .commit();
    }
    

    然后在任何需要在我执行进程后切换片段的例程中

    switchFragment(new TheFragmentIWantToSwitchTo)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2023-03-19
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多