欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android学习之Fragment使用

程序员文章站 2022-06-08 18:39:11
...

静态加载方法

  静态加载Fragment流程:
  1. 编写Fragment的xml布局文件;
  2. 继承Fragment类,实现自己的Fragment类,同时,实现onCreateView()方法,并在其中使用inflater.inflate加载布局文件,返回View;
  3. 在需要加载Fragment的Activity的布局文件中,添加fragment控件,并将name属性填写为刚刚自定义的Fragment类;
  4. 正常加载Activity的布局文件即可。

<!-- 第一步 -->
<!-- left_fragment.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00FF00"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Left Fragment"
        android:textColor="#000000"
        android:textSize="24sp" />

</LinearLayout>

<!-- right_fragment.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF0000"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Right Fragment"
        android:textColor="#000000"
        android:textSize="24sp" />

</LinearLayout>
// 第二步
// LeftFragment.java
public class LeftFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        return inflater.inflate(R.layout.left_fragment, container, false);
    }
}

// RightFragment.java
public class RightFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.right_fragment, container, false);
    }
}
<!-- 第三步 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/headlines_fragment"
        android:name="demo.show.fragments.LeftFragment"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/article_fragment"
        android:name="demo.show.fragments.RightFragment"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>
// 第四步
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

  运行结果
                    Android学习之Fragment使用
  注意,继承Fragemet类导包时,如果使用了v4的库,那么,Activity就应该继承自FragmentActivity,使用app.Fragment则不用。

动态加载方法

  动态加载Fragment流程:
  1. 获得FragmentManager对象,通过getFragmentManager();
  2. 获得FragmentTransaction对象,通过getFragmentManager().beginTransaction();
  3. 调用add()方法或者replace()方法加载Fragment;
  4. 加载完成后使用commit()方法提交。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Point size = new Point();
        getWindowManager().getDefaultDisplay().getSize(size);
        if(size.x > size.y) {
            HorizontalFragment horizontalFragment = new HorizontalFragment();
            getFragmentManager().beginTransaction().replace(R.id.fl_content,
                                                            horizontalFragment).commit();
        } else {
            VerticalFragment verticalFragment = new VerticalFragment();
            getFragmentManager().beginTransaction().replace(R.id.fl_content,
                                                            verticalFragment).commit();
        }
    }
}

  上面的代码就完成了动态Fragment的调动,首先HorizontalFragment和VerticalFragment跟静态加载Fragment时用的代码一样,只不过将名字改了,xml文件也是一样的只是改了一个名字。
  说明一下replace()方法,这里有两个参数,表示用第二个参数的fragment,替换第一个参数的对应id的容器。例如,上边的代码我将activity_main.xml布局文件中的根布局做了修改,将其掏空了只是放了一个FragmentLayout布局作为根容器,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fl_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</FrameLayout>

而上边replace(R.id.fl_content, horizontalFragment)就表示用horizontalFragment替换掉R.id.fl_content这个容器,这样就实现了动态加载Fragment了,实现效果如下:
         Android学习之Fragment使用

Fragment传值

  Activity给Fragment传递数据
  1. 首先创建Bundle对象,并设置要传递数据
  2. 使用Fragment对象的setArguments()方法,将Bundle对象传递过去
  3. 在Fragment中使用getArguments()方法获取即可使用

    // 修改之前MainActivity.java代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Point size = new Point();
        getWindowManager().getDefaultDisplay().getSize(size);
        // 创建Bundle对象
        Bundle bundle = new Bundle();
        bundle.putString("msg", "这是来自Activity的消息");
        if(size.x > size.y) {
            HorizontalFragment horizontalFragment = new HorizontalFragment();
            // 将Bundle对象设置给Fragment
            horizontalFragment.setArguments(bundle);
            getFragmentManager().beginTransaction().replace(android.R.id.content,
                                                            horizontalFragment).commit();
        } else {
            VerticalFragment verticalFragment = new VerticalFragment();
            // 将Bundle对象设置给Fragment
            verticalFragment.setArguments(bundle);
            getFragmentManager().beginTransaction().replace(android.R.id.content,
                                                            verticalFragment).commit();
        }
    }

    // 修改之前的VerticalFragment.java代码,横屏的同理
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 得到Bundle对象
        Bundle bundle = getArguments();
        // 获得字段
        String message = bundle.getString("msg");
        // 显示
        Toast.makeText(getActivity().getApplicationContext(), message, Toast.LENGTH_SHORT).show();
        return inflater.inflate(R.layout.vertical_fragment, container, false);
    }

  注意:getActivity()方法使用来获取Activity对象的,此方法可以使用Activity的公共方法或者参数,例如,getActivity().findViewById()
  效果如下:
                    Android学习之Fragment使用

  Fragment给Activity传递数据
  使用回调接口的方式实现,首先在Fragment中定一个回调接口,如下:

    /**
     * 接口
     */
    public interface CallBack {
        /**
         * 回调方法
         * @param msg 传回来的信息
         */
        void getResult(String msg);
    }

  然后,还是在Fragment中设定一个接口回调的函数

    /**
     * 接口回调函数
     * @param callBack 接口对象
     */
    public void getData(CallBack callBack) {
        // 根据实际情况传递参数,这里写String
        String msg = "回传一个字符串参数!";
        callBack.getResult(msg);
    }

  最后,在MainActivity中调用该方法即可

verticalFragment.getData(new VerticalFragment.CallBack() {
                @Override
                public void getResult(String msg) {
                    // msg就是回传的数据
                }
            });

  Fragment给Fragment传递数据
  这个传递有两种情况,
  1. 直接跳转有F1跳转到F2时可以使用setArguments()传递即可。
  2. 如果非跳转关系,那么就先在Activity中接收F1,然后传递给F2。
  
  以上是关于Fragment使用方式的学习和理解!