Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

一、Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fragment类中定义一个接口,并在它所属的Activity中实现该接口。Fragment在它的onAttach()方法执行期间捕获该接口的实现,然后就可以调用接口方法,以便跟Activity通信。

二、需求:利用ListFragment实现一个浮动的二级菜单,点击左边菜单在右边显示与之对应的二级菜单列表。效果如下图所示:

Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

 

废话不多说了,直接给大家上代码:

一、ListFragmentLeft(左边的ListFragment菜单) 

package com.yw.myapiupdate.fragment;



import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.ListFragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.Toast;



import com.yw.myapiupdate.R;



@SuppressLint("NewApi")

public class ListFragmentLeft extends ListFragment{

    private LeftFragmentCallback callback;

/*    String[] lists = new String[]{

            "贾克斯",

            "无双剑姬",

            "蕾欧娜",

            "安妮",

            "潘森",

            "盖伦"

    };*/

    

    @Override

    public void onAttach(Activity activity) {

        super.onAttach(activity);

        try{

            callback = (LeftFragmentCallback)activity;

        }catch(Exception e){

            

        }

    }

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,

            Bundle savedInstanceState) {

        return inflater.inflate(R.layout.listfragmentleft_layout, container, false);

    }

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(getActivity(),

                android.R.layout.simple_list_item_1,TestData.getInstance().getData(-1)));

    }

    

    @Override

    public void onListItemClick(ListView l, View v, int position, long id) {

        callback.leftCallback(position);

        /*Toast.makeText(getActivity(),      

                "You have selected:\t " + lists[position],      

                Toast.LENGTH_SHORT).show();   */  

    }

    /**

     * 回调接口

     * @author yw-tony

     *

     */

    public interface LeftFragmentCallback{

        public void leftCallback(int position);

    }

}

与之对应的布局文件:

<?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="#33ff00"

    android:orientation="vertical" >

    <ListView 

        android:id="@id/android:list"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1"

        android:drawSelectorOnTop="false"

        />



</LinearLayout>

二、点击左边菜单时弹出的右边菜单类(ListFragmentRight)

package com.yw.myapiupdate.fragment;



import com.yw.myapiupdate.R;



import android.annotation.SuppressLint;

import android.app.ListFragment;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.Toast;



@SuppressLint("NewApi")

public class ListFragmentRight extends ListFragment{

/*    String[] listRight = new String[]{

            "天启者",

            "赵信",

            "嘉文四世",

            "稻草人",

            "瑞文",

            "船长",

            "盲僧"

    };*/

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,

            Bundle savedInstanceState) {

        return inflater.inflate(R.layout.listfragment_right, container, false);

    }

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(getActivity(),

                android.R.layout.simple_list_item_1,TestData.getInstance().getData(1)));

    }

    @Override

    public void onListItemClick(ListView l, View v, int position, long id) {

        ((MyFragmentActivity)getActivity()).windowDiss();

        /*Toast.makeText(getActivity(),      

                "You have selected:\t " + listRight[position],      

                Toast.LENGTH_SHORT).show(); */    

    }

}

与之对应的布局文件:

<?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="#ff66ff"

    android:orientation="vertical" >

    <ListView 

        android:id="@id/android:list"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_weight="1"

        android:drawSelectorOnTop="false"

        />



</LinearLayout>

三、以上两者之间的通信桥梁Activity(MyFragmentActivity)

package com.yw.myapiupdate.fragment;



import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.FragmentManager;

import android.graphics.drawable.BitmapDrawable;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.WindowManager;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.PopupWindow;



import com.yw.myapiupdate.R;

import com.yw.myapiupdate.fragment.ListFragmentLeft.LeftFragmentCallback;



@SuppressLint("NewApi")

public class MyFragmentActivity extends Activity implements 

LeftFragmentCallback,OnClickListener{

/*    String[] lists = new String[]{

            "天启者",

            "赵信",

            "嘉文四世",

            "稻草人",

            "瑞文",

            "船长",

            "盲僧",

            "那身男爵"

    };*/

    private Button btn;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        TestData.getInstance().setData();

        setContentView(R.layout.listfragment_layout);

        btn = (Button)findViewById(R.id.listfragment_btn);

        btn.setOnClickListener(this);

        /*Display display = getWindowManager().getDefaultDisplay();

        if(display.getWidth() > display.getHeight()){

            FragmentRed red = new FragmentRed();

            getFragmentManager().beginTransaction().replace(R.id.fragment_linear_layout, red).commit();

        }else{

            FragmentYellow yellow = new FragmentYellow();

            getFragmentManager().beginTransaction().replace(R.id.fragment_linear_layout, yellow).commit();

        }*/

        initMenu();

    }

    private LayoutInflater inflater;

    private View view;

    private PopupWindow window;

    private void initMenu(){

        inflater = LayoutInflater.from(this);

        view = inflater.inflate(R.layout.popupwindow_layout, null);

        window = new PopupWindow(view,WindowManager.LayoutParams.FILL_PARENT,WindowManager.LayoutParams.FILL_PARENT);

        window.setWidth(WindowManager.LayoutParams.FILL_PARENT);

        window.setHeight(WindowManager.LayoutParams.FILL_PARENT);

        window.setFocusable(true);

        window.setOutsideTouchable(true);

        window.setBackgroundDrawable(new BitmapDrawable());

        

    }

    /**

     * 显示窗体

     * @param anchor

     */

    public void show(View anchor){

        if(window!=null && !window.isShowing()){

            window.showAsDropDown(anchor);

        }

    }

    /**

     * 关闭窗体

     */

    public void windowDiss(){

        if(window!=null && window.isShowing()){

            window.dismiss();

        }

    }

    @Override

    public void leftCallback(int position) {

        try{

            /*ListFragmentRight listRight = (ListFragmentRight)

                    getFragmentManager.findFragmentById(

                    R.id.listfragment_right);*/

            FragmentManager manager = getFragmentManager();

            ListFragmentRight listRight = (ListFragmentRight) manager.findFragmentById(R.id.listfragment_right);

            if(listRight != null){

                listRight.setListAdapter(new ArrayAdapter<String>(MyFragmentActivity.this,

                android.R.layout.simple_list_item_1,TestData.getInstance().getData((position+1))));

            }else{

                

            }

        }catch(Exception e){

            

        }

        

        

    }

    @Override

    public void onClick(View v) {

        switch(v.getId()){

            case R.id.listfragment_btn:

                if(window!=null && !window.isShowing()){

                    show(btn);

                }

                break;

        }

        

    }

    

    

}

与之对应的布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/fragment_linear_layout"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" 

    android:baselineAligned="false">

</LinearLayout>

四、提供静态数据源的工具类

package com.yw.myapiupdate.fragment;



import java.util.ArrayList;

import java.util.List;



public class TestData {

    private List<String> listParent = new ArrayList<String>();

    private List<String> listA = new ArrayList<String>();

    private List<String> listB = new ArrayList<String>();

    private List<String> listC = new ArrayList<String>();

    private List<String> listD = new ArrayList<String>();

    

    private TestData(){}

    private static TestData instance;

    public static TestData getInstance(){

        if(instance == null){

            synchronized (TestData.class) {

                if(instance == null){

                    instance = new TestData();

                }

            }

        }

        return instance;

    }

    /**

     * 获取数据

     * @param target

     * @return

     */

    public List<String> getData(int target){

//        List<String> lists = new ArrayList<String>();

        switch(target){

        case 1:

            return listA;

//            break;

        case 2:

            return listB;

//            break;

        case 3:

            return listC;

//            break;

        case 4:

            return listD;

//            break;

        }

        return listParent;

    }

    public void setData(){

        listParent.add("A");

        listParent.add("B");

        listParent.add("C");

        listParent.add("D");

        

        

        

        listA.add("A1");

        listA.add("A2");

        listA.add("A3");

        

        listB.add("B1");

        listB.add("B2");

        listB.add("B3");

        listB.add("B4");

        

        listC.add("C1");

        listC.add("C2");

        

        listD.add("D1");

        listD.add("D2");

        listD.add("D3");

        listD.add("D4");

        listD.add("D5");

    }



}

程序运行后的效果图:

Android Fragment(三)ListFragment简单介绍以及Fragment之间通信

好了,ListFragment以及他们之间的通信到此就结束了,你?弄明白了吗?

你可能感兴趣的:(Fragment)