zoukankan      html  css  js  c++  java
  • 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以及他们之间的通信到此就结束了,你?弄明白了吗?

  • 相关阅读:
    阿里巴巴
    实用得 JS 代码
    C#获得当前插入数据的ID
    “职场五魅”助你成功
    SQL2005导入导出数据库方法集合
    VS05里checkboxlist用JS获取 value值
    sql 去除html标签函数
    百度新闻搜索结果页的采集
    把表中的某个字段格式如:2,3,4的数据分别插入到另一个表中
    jquery 定位元素并获取数据
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3391822.html
Copyright © 2011-2022 走看看