Android开发(六)--- 再探Fragment

紧接着上一篇博客,这篇博客接着说Fragment。先来总结一篇博客中没有提到的重点!

全部使用support-v4.jar中的Fragment,千万不能和系统自带的Fragment用混了,这会导致一个你很难发现的错误!!!

对于MainActivity,必须派生自FragmentActivity,否则无法启动程序,因为系统的Activity只能盛系统的Fragment!!!

对于动态的添加Fragment,获取FragmentManager是通过v4包中的getSupportFragmentManager方法获得的,如果Fragment使用的是系统自带的Fragment,则需要用系统自带的getFragmentManager方法!!!

上一篇博客中最后一个例子讲述的是参数传递问题,其中参数传递问题共分为为两种:

一是在同一个container下,一个Fragment被另一个Fragment代替使得传值;

二是在同一个Activity下,不同的container的Fragment之间的参数传递,上篇博客中讲述的就是这种情况。

那么这篇博客主要讲述第一种情况的应用:

需求:在第一个Fragment1中点击“加载第二个Fragment2按钮”,加载出第二个Fragment2,同时传递参数“这是从Fragment1传递来的参数”,并在Fragment2中显示出来。

Fragment1的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yzg.fragmentpassvalue.Fragment1">

    <!-- TODO: Update blank fragment layout -->
    <Button
        android:id="@+id/bt_load_Fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="点击加载Fragment2"
        android:layout_gravity="center"
        />

</FrameLayout>

Fragment2的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yzg.fragmentpassvalue.Fragment2">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

Fragment1.java

package com.example.yzg.fragmentpassvalue;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class Fragment1 extends Fragment {
    Button button_load;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View inflate = inflater.inflate(R.layout.fragment_fragment1, null);
        button_load = inflate.findViewById(R.id.bt_load_Fragment);
        button_load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment2 fragment2 = new Fragment2().newInstance("这是从Fragment1传递来的参数");
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.add(R.id.root,fragment2);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commitAllowingStateLoss();
            }
        });

        return inflate;
    }

}

Fragment2.java

package com.example.yzg.fragmentpassvalue;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class Fragment2 extends Fragment {

    String value;
    TextView textView;


    /**
     * 静态方法,主要用于从Fragment1中传递来的参数进行展示 非常重要的方法
     * @param param1
     * @return
     */
    // TODO: Rename and change types and number of parameters
    public static Fragment2 newInstance(String param1) {
        Fragment2 fragment = new Fragment2();
        Bundle args = new Bundle();
        args.putString("value", param1);
        fragment.setArguments(args);
        return fragment;
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View inflate = inflater.inflate(R.layout.fragment_fragment2, null);
        if (getArguments()!=null){
            Bundle arguments = getArguments();
            value = arguments.getString("value");
            Log.d("测试", "onCreateView: "+value);
            textView = inflate.findViewById(R.id.tv_text);
            textView.setText(value);
        }
        return inflate;
    }

}

main的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root"
    android:orientation="vertical"
    tools:context="com.example.yzg.fragmentpassvalue.Main2Activity">

</android.support.v7.widget.LinearLayoutCompat>

main.java:

package com.example.yzg.fragmentpassvalue;

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.root,new Fragment1());
        fragmentTransaction.commitAllowingStateLoss();
    }
}

在Fragment1的Button的监听器中,创建Farngmenrt2的对象,并调用其中的静态方法

Fragment2 fragment2 = new Fragment2().newInstance("这是从Fragment1传递来的参数");

然后在添加到具体得到容器中,在Fragment的onCreateView方法中,获得相应的参数,然后进行相应的组件的改变。

综上所述,就完成了这个小小的需求,以上两篇博客大致就是Fragment的主要内容,后续会有补充的哦! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值