一、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(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); }}
与之对应的布局文件:
二、点击左边菜单时弹出的右边菜单类(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(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(); */ }}
与之对应的布局文件:
三、以上两者之间的通信桥梁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(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; } } }
与之对应的布局:
四、提供静态数据源的工具类
package com.yw.myapiupdate.fragment;import java.util.ArrayList;import java.util.List;public class TestData { private ListlistParent = new ArrayList (); private List listA = new ArrayList (); private List listB = new ArrayList (); private List listC = new ArrayList (); private List listD = new ArrayList (); 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 getData(int target){// List lists = new ArrayList (); 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以及他们之间的通信到此就结束了,你?弄明白了吗?