学习EventBus的记录

       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();
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值