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

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

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

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

一、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:	 " + 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:	 " + 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");
    }

}

程序运行后的效果图:

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

原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3391822.html