本文出自 “阿敏其人” 簡書博客批钠,轉(zhuǎn)載或引用請注明出處。
一個(gè)簡單的小綜合demo怠苔,分別演示:
- Material Design
- RxJava
- Retrofit
- RxJava+Retrofit
Paste_Image.png
一同廉、簡單的小架子
Paste_Image.png
布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mDrawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:fitsSystemWindows="true"
tools:context="com.am.mdrr.MainActivity">
<!--抽屜分兩部分 一部分內(nèi)容, 一部分導(dǎo)航-->
<!--抽屜的 內(nèi)容部分-->
<android.support.design.widget.CoordinatorLayout
android:id="@+id/mCoordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/mAppbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<android.support.v7.widget.Toolbar
android:id="@+id/mToolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/mFrameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/appbar"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
<!--抽屜 導(dǎo)航部分
分為 導(dǎo)航頭部和導(dǎo)航主菜單
可以通過 headerLayout 設(shè)置抽出方向-->
<android.support.design.widget.NavigationView
android:id="@+id/mNavigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_head"
app:menu="@menu/nav_main_part"
/>
</android.support.v4.widget.DrawerLayout>
設(shè)置抽屜導(dǎo)航的 頭部 和 菜單
.
.
MainActivity
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mActionBarDrawerToggle;
private Toolbar mToolbar;
private NavigationView mNavigationView;
private FragmentManager supportFragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.mToolbar);
setSupportActionBar(mToolbar);
supportFragmentManager = getSupportFragmentManager();
// 抽屜整體的一些設(shè)置柑司,toggle同步迫肖,添加toggle同步 沒卵用但是一定要加
mDrawerLayout = (DrawerLayout) findViewById(R.id.mDrawerLayout);
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open,
R.string.close);
mActionBarDrawerToggle.syncState();
mDrawerLayout.addDrawerListener(mActionBarDrawerToggle);
// 菜單的頭部
mNavigationView = (NavigationView) findViewById(R.id.mNavigation);
View headerView = mNavigationView.getHeaderView(0); // 得到菜單 的頭部
if(headerView!=null){
headerView.findViewById(R.id.mIvPic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchToRx();
mDrawerLayout.closeDrawers();
mNavigationView.getMenu().getItem(1).setChecked(true);
}
});
}
// 菜單的正式部分
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.nav_item_rx:
switchToRx();
break;
case R.id.nav_item_re:
switchToRe();
break;
case R.id.nav_item_rxre:
switchToRxRe();
break;
case R.id.nav_item_md:
switchToMd();
break;
case R.id.nav_item_about:
switchToAbout();
break;
}
menuItem.setChecked(true); // 把當(dāng)前菜單的item置為選中狀態(tài)
mDrawerLayout.closeDrawers(); // 抽屜合起來,隱藏菜單
// 默認(rèn)返回flase攒驰,自己實(shí)現(xiàn)邏輯需要返回true
return true;
}
});
}
private void switchToRx() {
supportFragmentManager.beginTransaction().replace(R.id.mFrameLayout, new RxFragment()).commit();
mToolbar.setTitle("RxJava");
}
private void switchToRe() {
supportFragmentManager.beginTransaction().replace(R.id.mFrameLayout, new ReFragment()).commit();
mToolbar.setTitle("Retrofit");
}
private void switchToRxRe() {
supportFragmentManager.beginTransaction().replace(R.id.mFrameLayout, new RxReFragment()).commit();
mToolbar.setTitle("RxJava Retrofit");
}
private void switchToMd() {
supportFragmentManager.beginTransaction().replace(R.id.mFrameLayout, new MdFragment()).commit();
mToolbar.setTitle("Material Design");
}
private void switchToAbout() {
supportFragmentManager.beginTransaction().replace(R.id.mFrameLayout, new AboutFragment()).commit();
mToolbar.setTitle("About");
}
}
gif
小架子.gif
二蟆湖、 Md Widget
*SnackBar
- CardView
- RecyclerView
- TextInputLayput
- FloatingActionButton
- ToolBar
- CoordinatorLaypout
- CollasoingToolvarLaypout
- NestedScrollView
- TabLayout
簡圖如下
MdShow.gif
注:
關(guān)于RecyclerView沒有單獨(dú)開一個(gè)activity,但是其實(shí)列表本事就是RecyclerView了玻粪,想學(xué)參考可以參考這里:RecyclerView良好參考
關(guān)于md控件隅津,可以參考這里:
MD系列2、ToolBar+DrawerLayout + NavigationView
Md系列3劲室、CoordinatorLayout 里 Toobar和TabLayout等發(fā)生的一系列故事
三伦仍、RxJava
RxJava和Retrofit往往是一起使用的。
所以 build.gradle添加如下引入
compile 'io.reactivex:rxjava:1.1.7'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.google.code.gson:gson:2.7'
分點(diǎn):
- RxJava初認(rèn)識(shí)
- Observer+Observable
- Subscriber+Observable
- 快捷創(chuàng)建事件很洋,just
- 快捷創(chuàng)建事件充蓝,from
- 不完整回調(diào)ActionX
- Scheduler調(diào)度器
- Scheduler切換線程
- 變換入門
- 變換flatMap
- 應(yīng)用場景
gif
Rx.gif
RxJava可以參考這里:旁邊那門轉(zhuǎn)左看到一個(gè)RxJava
四、Retrofit
當(dāng)前只做了一個(gè)示例蹲缠,就是RxJava和Retrofit結(jié)合的獲取天氣的demo頁面棺克。
Retro.gif
關(guān)鍵代碼
String baseUrl = "http://apistore.baidu.com/";
// 創(chuàng)建一個(gè) retrofit ,baseUrl必須有
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create()) // 用到了 com.squareup.retrofit2:adapter-rxjava:2.1.0'
.build();
// 利用 retrofit 創(chuàng)建一個(gè)接口
WeatherApi apiService = retrofit.create(WeatherApi.class);
// 利用接口創(chuàng)建一個(gè)Call對象
Call<WeatherBean> weatherBeanCall = apiService.getWeather("beijing");
// 請求入隊(duì)线定,回調(diào)請求成功或者失敗
weatherBeanCall.enqueue(new Callback<WeatherBean>() {
@Override
public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
System.out.println("====請求成功:"+response.body().retData.weather);
mTvData.setText(response.body().retData.weather);
}
@Override
public void onFailure(Call<WeatherBean> call, Throwable t) {
System.out.println("====請求失敗");
mTvData.setText(t.getMessage());
}
});
Retrofit可以參考這里:
Retrofit應(yīng)用小記
五娜谊、RxJava + Retrofit
簡單的demo,獲取文本笑話
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'io.reactivex:rxandroid:1.2.1'
Re加Rx.gif
先這樣斤讥,沒事再完善纱皆。