EventBus现在的应用比较广泛。要是你还没有听说过,或是没有用到,就有点out了。https://github.com/greenrobot/EventBus这是地址。
这里推荐一个blog大家可以去看一下,相当的不错
http://blog.csdn.net/lmj623565791/article/details/40920453与http://blog.csdn.net/lmj623565791/article/details/40794879,作者做了简单的例子,而且对源码进行了分析了。这里我把自己做的例子,放在此处,做一个记录。
例子,比较简单,一共两个功能,一个是从访问网上数据,通过 webserves来读取相关的数据,显示在页面当中,另一个就是我们现在常用的DrawerLayout来切换菜单。
一,访问网络下载加载到listview中
直接上代码:
activity_loading_data.xml主布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.cg.eventbuslearn.LoadingDataActivity"
android:orientation="vertical">
<include
layout="@layout/toolbar" />
<ListView
android:id="@+id/lv_loadingdata"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
activity_loadingdata_item.xml Item布局
<?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">
<TextView
android:id="@+id/txt_loadingdata_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"/>
</LinearLayout>
LoadingData_Adatper.java 加载数据的Adapter
package com.example.cg.eventbuslearn.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.cg.eventbuslearn.R;
import java.util.List;
/**
* 加载远程数据Adapter
* Created by cg on 2016/1/13.
*/
public class LoadingData_Adatper extends BaseAdapter {
List<String> list_data;
LayoutInflater inflater;
public LoadingData_Adatper(Context context,List<String> list_data) {
this.inflater = LayoutInflater.from(context);
this.list_data = list_data;
}
@Override
public int getCount() {
return list_data.size();
}
@Override
public Object getItem(int position) {
return list_data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
loadingDataItem ldt;
if(convertView==null)
{
ldt = new loadingDataItem();
convertView = inflater.inflate(R.layout.activity_loadingdata_item,null);
ldt.name = (TextView)convertView.findViewById(R.id.txt_loadingdata_name);
convertView.setTag(ldt);
}else
{
ldt = (loadingDataItem)convertView.getTag();
}
ldt.name.setText(list_data.get(position));
return convertView;
}
class loadingDataItem
{
TextView name;
}
}
LoadingDataActivity.java 主程序
package com.example.cg.eventbuslearn;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.ListView;
import com.example.cg.eventbuslearn.Adapter.LoadingData_Adatper;
import com.example.cg.eventbuslearn.untils.webservicesUntils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
public class LoadingDataActivity extends AppCompatActivity {
private Toolbar toolbar; //定义toolbar
private ListView lv_loadingdata;
private LoadingData_Adatper lAdatper;
private List<String> list_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading_data);
toolbar = (Toolbar) this.findViewById(R.id.toolbar);
toolbar.setTitle("EventBus加载远程数据");
setSupportActionBar(toolbar);
//订阅事件
EventBus.getDefault().register(this);
initControls();
initData();
}
/**
* 初始化数据
*/
private void initData() {
list_data = new ArrayList<>();
lAdatper = new LoadingData_Adatper(this,list_data);
lv_loadingdata.setAdapter(lAdatper);
new Thread(new Runnable() {
@Override
public void run() {
try {
String soapObject = webservicesUntils.getIndexItemList("", "", 1, 10);
//Log.e("soapObject",soapObject);
if (soapObject != "0") {
try {
JSONArray jsonArray = new JSONArray(soapObject);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = (JSONObject) jsonArray.opt(i);
list_data.add(jsonObject2.getString("questionTitle"));
}
EventBus.getDefault().post(list_data);
} catch (JSONException e) {
// TODO Auto-generated catch block
//Log.e("error",e.getMessage().toString());
e.printStackTrace();
}
}
} catch (Exception ex) {
}
}
}).start();
}
/**
* 加载数据
* @param event
*/
public void onEventMainThread(List<String> event)
{
lAdatper.notifyDataSetChanged();
}
/**
* 初始化控件
*/
private void initControls() {
lv_loadingdata = (ListView)findViewById(R.id.lv_loadingdata);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
EventBus.getDefault().unregister(this);
}
}
二,通过DrawerLayout切换菜单
activity_fragment_to_fragment.xml主布局
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_main"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/toolbar" />
<!-- 内容界面 -->
<FrameLayout
android:id="@+id/frame_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- 侧滑菜单内容 -->
<fragment
android:id="@+id/navigation_drawer"
android:name="com.example.cg.eventbuslearn.untils.tool_NavigationDrawerFragment"
android:layout_width="@dimen/navigationWidth"
android:layout_height="match_parent"
android:layout_gravity="start" />
</android.support.v4.widget.DrawerLayout>
toolbar.xml toolbar布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar">
</android.support.v7.widget.Toolbar>
fragment_main_drawer.xml DrawerLayout布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<LinearLayout
android:id="@+id/linear_drawer_login"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:orientation="vertical"
android:background="#3A5FCD">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:gravity="center_vertical">
<com.example.cg.eventbuslearn.untils.CircleImageView
android:id="@+id/img_userPic"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:src="@drawable/img_empty_followers"
app:border_width="1dp"
app:border_color="@color/white"
/>
</LinearLayout>
<TextView
android:id="@+id/txt_main_drawer_UserNick"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="我本无名"
android:textColor="@color/white"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/txt_main_drawer_UserProfile"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="码农"
android:textSize="@dimen/main_drawer_small"
android:textColor="@color/white"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"/>
</LinearLayout>
<ListView
android:id="@+id/lv_main_drawer_leftmenu"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="6"
android:background="@color/white"
android:choiceMode="singleChoice"
android:layout_marginTop="5dp"
android:divider="@null"
android:scrollbars="none"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/white"
android:layout_marginTop="5dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="@color/grey"
android:contentDescription="@string/Guide_fragment_img_Description"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linear_drawer_chanageStyle"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:background="@drawable/main_drawer_background"
android:clickable="true"
android:gravity="center_vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="@string/navigation_Menu_changeStyle"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="@drawable/main_drawer_text_color"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/linear_drawer_setting"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:background="@drawable/main_drawer_background"
android:clickable="true"
android:gravity="center_vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="@string/navigation_Menu_setting"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="@drawable/main_drawer_text_color"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
fragment_main_drawer_item.xml DrawerLayout中可点击菜单布局
<?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:padding="16dp"
android:gravity="center_vertical"
android:background="@drawable/main_drawer_background"
android:orientation="horizontal">
<ImageView
android:id="@+id/item_icon"
android:layout_marginRight="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="@drawable/main_drawer_text_color"
android:gravity="center_vertical"
/>
</LinearLayout>
tool_NavigationDrawerFragment.java
package com.example.cg.eventbuslearn.untils;
import android.app.Fragment;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.example.cg.eventbuslearn.Adapter.Main_Drawer_lv_Adapter;
import com.example.cg.eventbuslearn.R;
import com.example.cg.eventbuslearn.bean.MainDrawerMenu;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
/**
* 左侧侧滑菜单的fragment
* Created by cg on 2015/8/26.
*/
public class tool_NavigationDrawerFragment extends Fragment implements View.OnClickListener {
private ListView lv_main_drawer_leftmenu; //定义菜单的listView
private List<MainDrawerMenu> list_menu;
private LinearLayout linear_drawer_login; //定义用户登录之后的页面布局
private LinearLayout linear_drawer_noLogin; //定义用户未登录之后的页面布局
private TextView txt_drawer_nologin_login; //定义登录注册按钮
private CircleImageView img_userPic; //用户图片
private TextView txt_main_drawer_UserNick; //用户姓名
private TextView txt_main_drawer_UserProfile; //用户简介
private LinearLayout linear_drawer_chanageStyle; //切换主题
private LinearLayout linear_drawer_setting; //设置
private LinearLayout linear_drawer_nostyle;
private LinearLayout linear_drawer_nosetting;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main_drawer,container,false);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
//EventBus.getDefault().unregister(this);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lv_main_drawer_leftmenu = (ListView)view.findViewById(R.id.lv_main_drawer_leftmenu);
list_menu = getMenuItem();
lv_main_drawer_leftmenu.setAdapter(new Main_Drawer_lv_Adapter(getActivity(), list_menu));
lv_main_drawer_leftmenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
EventBus.getDefault().post(list_menu.get(position).getMainDrawer_menuName());
}
});
linear_drawer_login = (LinearLayout)view.findViewById(R.id.linear_drawer_login);
img_userPic = (CircleImageView)view.findViewById(R.id.img_userPic);
txt_main_drawer_UserNick = (TextView)view.findViewById(R.id.txt_main_drawer_UserNick);
txt_main_drawer_UserProfile = (TextView)view.findViewById(R.id.txt_main_drawer_UserProfile);
linear_drawer_chanageStyle = (LinearLayout)view.findViewById(R.id.linear_drawer_chanageStyle);
linear_drawer_chanageStyle.setOnClickListener(this);
linear_drawer_setting = (LinearLayout)view.findViewById(R.id.linear_drawer_setting);
linear_drawer_setting.setOnClickListener(this);
}
/**
* 从arrays.xml中取出数据,装入list<T>中
* @return 返回菜单名称列表
*/
private List<MainDrawerMenu> getMenuItem()
{
List<MainDrawerMenu> list_menu = new ArrayList<MainDrawerMenu>();
String[] itemTitle = getResources().getStringArray(R.array.item_title);
TypedArray itemIconRes = getResources().obtainTypedArray(R.array.item_icon_res);
for(int i=0;i<itemTitle.length;i++)
{
MainDrawerMenu lmi = new MainDrawerMenu();
lmi.setMainDrawer_icon(itemIconRes.getResourceId(i,0));
lmi.setMainDrawer_menuName(itemTitle[i]);
list_menu.add(lmi);
}
return list_menu;
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.linear_drawer_chanageStyle:
break;
case R.id.linear_drawer_setting:
break;
}
}
}
主程序 FragmentToFragmentActivity.java
package com.example.cg.eventbuslearn;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.Toast;
import de.greenrobot.event.EventBus;
/**
* 实现的是左侧Fragment点击事件,主页面得到
* 这里注意一点的是,因为我们的布局,左侧侧滑布局也是在主页面当中的,所以在tool_NavigationDrawerFragment.java不要进行注册。直接在此页注册就OK了
*/
public class FragmentToFragmentActivity extends AppCompatActivity {
private Toolbar toolbar; //定义toolbar
private DrawerLayout drawer_main; //定义左侧滑动布局,其实就是主布局
private ftf_IndexFragment iFragment;
private ftf_FindFragment fFragment;
private ftf_AttentionFragment aFragment;
private ftf_CollectionFragment cFragment;
private ftf_DraftFragment dFragment;
private Fragment isFragment; //记录当前正在使用的fragment
/**
* 供其它页面调用
* @param context 上下文
*/
public static void FragmentToFragmentStart(Context context)
{
Intent intent = new Intent(context,FragmentToFragmentActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_to_fragment);
EventBus.getDefault().register(this);
toolbar = (Toolbar) this.findViewById(R.id.toolbar);
toolbar.setTitle("Fragment之间的传值");
setSupportActionBar(toolbar);
//为了生成,工具栏左上角的动态图标,要使用下面的方法
drawer_main = (DrawerLayout) findViewById(R.id.drawer_main);
initFragment(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
/**
* 当fragment进行切换时,采用隐藏与显示的方法加载fragment以防止数据的重复加载
* @param from
* @param to
*/
public void switchContent(Fragment from, Fragment to) {
if (isFragment != to) {
isFragment = to;
FragmentManager fm = getSupportFragmentManager();
//添加渐隐渐现的动画
FragmentTransaction ft = fm.beginTransaction();//.setCustomAnimations(
// android.R.animator.fade_in, android.R.animator.fade_out);
//FragmentTransaction ft = fm.beginTransaction().setCustomAnimations(R.anim.in_from_right_fragment,R.anim.out_to_left_fragment);
if (!to.isAdded()) { // 先判断是否被add过
ft.hide(from).add(R.id.frame_main, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
ft.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
}
}
}
/**
* 为页面加载初始状态的fragment
*/
public void initFragment(Bundle savedInstanceState)
{
//判断activity是否重建,如果不是,则不需要重新建立fragment.
if(savedInstanceState==null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (iFragment == null) {
iFragment = new ftf_IndexFragment();
}
isFragment = iFragment;
ft.replace(R.id.frame_main, iFragment).commit();
}
}
public void onEventMainThread(String menuName)
{
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
switch (menuName)
{
case "首页" :
if(iFragment!=null) {
iFragment = new ftf_IndexFragment();
}
switchContent(isFragment,iFragment);
break;
case "发现" :
if(fFragment==null)
{
fFragment = new ftf_FindFragment();
}
switchContent(isFragment,fFragment);
break;
case "关注" :
if(aFragment==null)
{
aFragment = new ftf_AttentionFragment();
}
switchContent(isFragment,aFragment);
break;
case "收藏" :
if(cFragment==null)
{
cFragment = new ftf_CollectionFragment();
}
switchContent(isFragment,cFragment);
break;
case "草稿" :
if(dFragment==null)
{
dFragment = new ftf_DraftFragment();
}
switchContent(isFragment,dFragment);
break;
case "提问" :
break;
case "切换主题":
Toast.makeText(this, "对不起,无样式可以切换", Toast.LENGTH_SHORT).show();
break;
case "设置":
break;
}
invalidateOptionsMenu();
/**
* 关闭左侧滑出菜单
*/
drawer_main.closeDrawers();
}
}