一、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:\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"); } }
程序运行后的效果图:
好了,ListFragment以及他们之间的通信到此就结束了,你?弄明白了吗?