学习EventBus的记录

来源:互联网 发布:jwt php类库 编辑:程序博客网 时间:2024/06/05 10:06

       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 0
原创粉丝点击