一、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以及他们之间的通信到此就结束了,你?弄明白了吗?

Android Fragment(三)ListFragment简单介绍以及Fragment之间通信的更多相关文章

  1. Fragment的使用简单介绍【Android】

    Fragment在实际项目开发中使用的越来越多,如今简介一下 布局文件: <LinearLayout xmlns:android="http://schemas.android.com ...

  2. Android 懒加载简单介绍

    1.懒加载介绍 1.1.效果预览 1.2.效果讲解 当页面可见的时候,才加载当前页面. 没有打开的页面,就不会预加载. 说白了,懒加载就是可见的时候才去请求数据. 1.3.懒加载文章传送门 参考文章: ...

  3. NDK中android.mk文件的简单介绍和第三方库的调用

    先贴一个样例,然后解释一下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mydjvuapi SRC_FILE_ ...

  4. 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  5. Android Studio使用心得 - 简单介绍与环境配置

    FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/38544823,未经本人允许请勿用于商业用途.感谢支持! 关 ...

  6. Android线程---UI线程和非UI线程之间通信

        近期自学到了线程这一块,用了一上午的时间终于搞出来了主.子线程间的相互通信.当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message.我的主线程 ...

  7. ANDROID培训准备资料之四大组件的简单介绍

    Android四大组件是一个android app 最基本的组成部分,这篇博客主要给大家简单的介绍一下四种组件 (1)Activities (2)Services (3)BroadcastReceiv ...

  8. 介绍开源的.net通信框架NetworkComms框架 源码分析

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 售价249英镑 我曾经花了 ...

  9. Android中Fragment的简单介绍

    Android是在Android 3.0 (API level 11)引入了Fragment的,中文翻译是片段或者成为碎片(个人理解),可以把Fragment当成Activity中的模块,这个模块有自 ...

随机推荐

  1. python序列函数

    zip:序列并行处理 >>> name=['ghostwu','wukong','bajie'] >>> age=['] >>> sex=['ma ...

  2. POJ1284(SummerTrainingDay04-K 原根)

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4505   Accepted: 2652 D ...

  3. Python面试题都在这里了

    转自武沛齐博客:http://www.cnblog.com/wupeiqi/ 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java ...

  4. python内置函数每日一学 -- all()

    all(iterable) 官方文档解释: Return True if all elements of the iterable are true (or if the iterable is em ...

  5. IO流作业

    IO流作业 一.    填空题 Java IO流可以分为    字节流          和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道 ...

  6. 5月23日——SPA单页面应用的原理

    一.什么是SPA(SPA 的概念) 单页 Web 应用 (single-page application 简称为 SPA),简单理解为:仅仅在web页面初始化时加载相应的HTML.JavaScript ...

  7. 高并发情况下,如何生成分布式全局id

    1.使用UUID生成全局id,不占用宽带 2.基于数据库自增或者序列生成全局id,占用宽带,设置自增步长实现集群,但可扩展性差 3.基于redis生成全局id,占用宽度,设置自增步长实现集群,性能比数 ...

  8. 前端开发笔记(2)css基础(上)

    CSS介绍 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS ...

  9. LeetCode题解之 Implement strStr()

    1.题目描述 2.题目分析 字符串操作,注意边界条件即可. 3.代码 int strStr(string haystack, string needle) { int n = needle.size( ...

  10. 自己实现more命令

    #include <stdio.h> #include <stdlib.h> #define PAGELEN 24 #define LINELEN 512 int see_mo ...