├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── wuxiaolongl │ │ └── designsupportlibrarysample │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── wuxiaolong │ │ └── designsupportlibrarysample │ │ ├── AndroidApplication.java │ │ ├── AppConstants.java │ │ ├── AppShortcutsActivity.java │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ ├── BottomNavigationActivity.java │ │ ├── ContentFragment.java │ │ ├── DetailActivity.java │ │ ├── FristFragment.java │ │ ├── LoginActivity.java │ │ ├── MainActivity.java │ │ ├── RecyclerViewAdapter.java │ │ ├── SecondFragment.java │ │ ├── TabLayoutActivity.java │ │ └── ThirdFragment.java │ └── res │ ├── color │ ├── bottom_item_text_color.xml │ ├── custom_tab_text.xml │ └── item_text_color.xml │ ├── drawable │ ├── custom_tab_icon.xml │ ├── ic_add_24dp.xml │ ├── ic_content_copy_24dp.xml │ ├── ic_link_24dp.xml │ ├── ic_mode_edit_white_24dp.xml │ ├── ic_preview_24dp.xml │ ├── ic_search_24dp.xml │ ├── ic_share_24dp.xml │ ├── shadow.xml │ └── tab_point_bg.xml │ ├── layout │ ├── activity_app_shortcuts.xml │ ├── activity_bottom_navigation.xml │ ├── activity_detail.xml │ ├── activity_login.xml │ ├── activity_main.xml │ ├── activity_tab_layout.xml │ ├── custom_tab.xml │ ├── custom_tab1.xml │ ├── drawer_header.xml │ ├── fragment_content.xml │ ├── fragment_frist.xml │ ├── fragment_second.xml │ ├── fragment_third.xml │ ├── recyclerview_item.xml │ ├── sheet_dialog.xml │ └── toolbar.xml │ ├── menu │ ├── drawer.xml │ ├── menu_app_bar_layout.xml │ ├── menu_bottom_navigation_items.xml │ ├── menu_coordinator_layout.xml │ ├── menu_frist.xml │ ├── menu_main.xml │ └── menu_navigation_view.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── show_img1.jpg │ └── show_img2.jpg │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── material_design_wallpapers5.png │ ├── qrcode_wuxiaolong.jpg │ ├── tab_bg0.png │ └── tab_bg1.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-night │ ├── colors.xml │ └── styles.xml │ ├── values-v21 │ └── dimens.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── attr.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── shortcuts.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshots └── designsupportlibrarysample.gif └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | C:\Users\WuXiaolong\AppData\Roaming\Subversion 48 | 49 | 50 | 51 | 52 | 53 | 1.8 54 | 55 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 详细博客 2 | [Android Design Support Library使用](https://wuxiaolong.github.io/2015/11/06/DesignSupportLibrary/) 3 | 4 | # 联系我 5 | 我的微信公众号:吴小龙同学,欢迎关注交流。 6 | 7 | ![](http://7q5c2h.com1.z0.glb.clouddn.com/qrcode_wuxiaolong.jpg) 8 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | def supportVersion = "25.3.1" 4 | 5 | android { 6 | compileSdkVersion 25 //如果想看App Shortcuts效果,这里写25 7 | buildToolsVersion '26.0.0' 8 | 9 | defaultConfig { 10 | applicationId "com.wuxiaolong.designsupportlibrarysample" 11 | minSdkVersion 14 //如果想看App Shortcuts效果,这里写25 12 | targetSdkVersion 25 13 | versionCode 1 14 | versionName "1.0" 15 | vectorDrawables.useSupportLibrary = true 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(include: ['*.jar'], dir: 'libs') 27 | compile 'com.android.support:appcompat-v7:' + supportVersion 28 | compile 'com.android.support:support-v4:' + supportVersion 29 | compile 'com.android.support:design:' + supportVersion 30 | compile 'com.android.support:recyclerview-v7:' + supportVersion 31 | compile 'com.android.support:cardview-v7:' + supportVersion 32 | compile 'com.wuxiaolong.pullloadmorerecyclerview:library:1.1.1' 33 | compile 'com.wuxiaolong.androidutils:androidutils:1.0.6' 34 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 35 | } 36 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/wuxiaolongl/designsupportlibrarysample/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.example.wuxiaolongl.designsupportlibrarysample; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/AndroidApplication.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.app.Application; 4 | import android.support.v7.app.AppCompatDelegate; 5 | 6 | import com.wuxiaolong.androidutils.library.LogUtil; 7 | import com.wuxiaolong.androidutils.library.SharedPreferencesUtil; 8 | 9 | /** 10 | * Created by WuXiaolong 11 | * on 2016/7/12. 12 | * 官网文档:https://material.google.com/ 13 | * 个人博客:http://wuxiaolong.me/ 14 | * 公众号:吴小龙同学 15 | */ 16 | public class AndroidApplication extends Application { 17 | 18 | @Override 19 | public void onCreate() { 20 | super.onCreate(); 21 | boolean isNight = SharedPreferencesUtil.getBoolean(this, AppConstants.ISNIGHT, false); 22 | LogUtil.d("isNight=" + isNight); 23 | if (isNight) { 24 | //使用夜间模式 25 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); 26 | } else { 27 | //不使用夜间模式 28 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/AppConstants.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | /** 5 | * Created by 吴小龙同學 6 | * on 2015/11/16 7 | * 官网文档:https://material.google.com/ 8 | * 个人博客:http://wuxiaolong.me/ 9 | * 公众号:吴小龙同学 10 | */ 11 | 12 | public class AppConstants { 13 | public static final String ISNIGHT = "isNight"; 14 | public static final String CURRENT_INDEX = "currentIndex"; 15 | public static final String TRANSITION_PIC = "transitionPic"; 16 | public static final String TRANSITION_SEARCHVIEW = "transitionSearchView"; 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/AppShortcutsActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.content.Intent; 4 | import android.content.pm.ShortcutInfo; 5 | import android.content.pm.ShortcutManager; 6 | import android.graphics.drawable.Icon; 7 | import android.net.Uri; 8 | import android.os.Bundle; 9 | import android.view.View; 10 | 11 | import java.util.ArrayList; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | public class AppShortcutsActivity extends BaseActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_app_shortcuts); 21 | initToolbar("AppShortcuts"); 22 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 23 | @Override 24 | public void onClick(View view) { 25 | ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); 26 | ShortcutInfo shortcut = new ShortcutInfo.Builder(mActivity, "shortcutId3") 27 | .setShortLabel("Web site") 28 | .setLongLabel("Open the web site") 29 | .setIcon(Icon.createWithResource(mActivity, R.drawable.ic_link_24dp)) 30 | .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://wuxiaolong.me/"))) 31 | .build(); 32 | try { 33 | shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut)); 34 | } catch (Exception e) { 35 | e.printStackTrace(); 36 | } 37 | 38 | } 39 | }); 40 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View view) { 43 | ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); 44 | List shortcutInfoList = shortcutManager.getDynamicShortcuts();//可以做个list管理App Shortcuts,这里略 45 | List list = new ArrayList<>(); 46 | list.add("shortcutId3"); 47 | try { 48 | shortcutManager.removeDynamicShortcuts(list); 49 | } catch (Exception e) { 50 | e.printStackTrace(); 51 | } 52 | 53 | } 54 | }); 55 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { 56 | @Override 57 | public void onClick(View view) { 58 | ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); 59 | List list = new ArrayList<>(); 60 | list.add("shortcutId3"); 61 | try { 62 | shortcutManager.disableShortcuts(list); 63 | } catch (Exception e) { 64 | e.printStackTrace(); 65 | } 66 | 67 | } 68 | }); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.support.design.widget.Snackbar; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.Toolbar; 8 | import android.view.MenuItem; 9 | import android.view.View; 10 | 11 | /** 12 | * Created by 吴小龙同學 13 | * on 2015/11/16 14 | * 官网文档:https://material.google.com/ 15 | * 个人博客:http://wuxiaolong.me/ 16 | * 公众号:吴小龙同学 17 | */ 18 | public class BaseActivity extends AppCompatActivity { 19 | public Activity mActivity; 20 | 21 | @Override 22 | protected void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | mActivity = this; 25 | } 26 | 27 | public Toolbar initToolbarAsHome() { 28 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 29 | setSupportActionBar(toolbar); 30 | android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 31 | if (actionBar != null) { 32 | actionBar.setDisplayHomeAsUpEnabled(false); 33 | 34 | } 35 | return toolbar; 36 | } 37 | 38 | public Toolbar initToolbar(String title) { 39 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 40 | toolbar.setTitle(title); 41 | setSupportActionBar(toolbar); 42 | android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 43 | if (actionBar != null) { 44 | actionBar.setDisplayHomeAsUpEnabled(true); 45 | 46 | } 47 | return toolbar; 48 | } 49 | 50 | public void showSnackbar(View view, CharSequence text) { 51 | Snackbar.make(view, text, Snackbar.LENGTH_SHORT).show(); 52 | } 53 | 54 | @Override 55 | public boolean onOptionsItemSelected(MenuItem item) { 56 | 57 | switch (item.getItemId()) { 58 | case android.R.id.home: 59 | super.onBackPressed(); 60 | break; 61 | default: 62 | //对没有处理的事件,交给父类来处理 63 | return super.onOptionsItemSelected(item); 64 | 65 | } 66 | 67 | return true; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | import android.app.Activity; 5 | import android.content.Context; 6 | import android.support.design.widget.Snackbar; 7 | import android.support.v4.app.Fragment; 8 | import android.view.View; 9 | import android.widget.Toast; 10 | 11 | /** 12 | * Created by 吴小龙同學 13 | * on 2015/11/16 14 | * 官网文档:https://material.google.com/ 15 | * 个人博客:http://wuxiaolong.me/ 16 | * 公众号:吴小龙同学 17 | */ 18 | public class BaseFragment extends Fragment { 19 | public Activity mActivity; 20 | 21 | @Override 22 | public void onAttach(Context context) { 23 | super.onAttach(context); 24 | mActivity = getActivity(); 25 | } 26 | 27 | public void showSnackbar(View view, CharSequence text) { 28 | Snackbar.make(view, text, Snackbar.LENGTH_SHORT).show(); 29 | } 30 | 31 | public void showToast(CharSequence text) { 32 | Toast.makeText(mActivity, text, Toast.LENGTH_SHORT).show(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/BottomNavigationActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.design.widget.BottomNavigationView; 6 | import android.view.MenuItem; 7 | 8 | public class BottomNavigationActivity extends BaseActivity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_bottom_navigation); 14 | initToolbar("BottomNavigation"); 15 | BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView); 16 | bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 17 | @Override 18 | public boolean onNavigationItemSelected(@NonNull MenuItem item) { 19 | switch (item.getItemId()) { 20 | case R.id.item1: 21 | break; 22 | case R.id.item2: 23 | break; 24 | case R.id.item3: 25 | break; 26 | } 27 | return false; 28 | } 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/ContentFragment.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import com.wuxiaolong.pullloadmorerecyclerview.PullLoadMoreRecyclerView; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | /** 17 | * Created by 吴小龙同學 18 | * on 2016/9/11. 19 | * 官网文档:https://material.google.com/ 20 | * 个人博客:http://wuxiaolong.me/ 21 | * 公众号:吴小龙同学 22 | */ 23 | public class ContentFragment extends Fragment { 24 | // 标志位,标志已经初始化完成,因为setUserVisibleHint是在onCreateView之前调用的,在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常 25 | private boolean isPrepared; 26 | //标志当前页面是否可见 27 | private boolean isVisible; 28 | private PullLoadMoreRecyclerView mPullLoadMoreRecyclerView; 29 | private List mDataList = new ArrayList<>(); 30 | private RecyclerViewAdapter mRecyclerViewAdapter; 31 | private String mTitle; 32 | private Handler handler; 33 | private Runnable runnable; 34 | private int page = 1; 35 | 36 | @Override 37 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 38 | Bundle savedInstanceState) { 39 | // Inflate the layout for this fragment 40 | return inflater.inflate(R.layout.fragment_content, container, false); 41 | } 42 | 43 | @Override 44 | public void onViewCreated(View view, Bundle savedInstanceState) { 45 | super.onViewCreated(view, savedInstanceState); 46 | mTitle = this.getArguments().getString("title"); 47 | mPullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) view.findViewById(R.id.pullLoadMoreRecyclerView); 48 | mPullLoadMoreRecyclerView.setLinearLayout(); 49 | mPullLoadMoreRecyclerView.setRefreshing(true); 50 | mRecyclerViewAdapter = new RecyclerViewAdapter(getActivity(), mDataList); 51 | mPullLoadMoreRecyclerView.setAdapter(mRecyclerViewAdapter); 52 | mPullLoadMoreRecyclerView.setOnPullLoadMoreListener(new PullLoadMoreRecyclerView.PullLoadMoreListener() { 53 | @Override 54 | public void onRefresh() { 55 | page = 1; 56 | mDataList.clear(); 57 | setList(); 58 | 59 | } 60 | 61 | @Override 62 | public void onLoadMore() { 63 | loadMore(); 64 | } 65 | }); 66 | isPrepared = true; 67 | lazyLoad(); 68 | } 69 | 70 | 71 | @Override 72 | public void setUserVisibleHint(boolean isVisibleToUser) { 73 | super.setUserVisibleHint(isVisibleToUser); 74 | //懒加载 75 | if (getUserVisibleHint()) { 76 | isVisible = true; 77 | onVisible(); 78 | } else { 79 | isVisible = false; 80 | onInvisible(); 81 | } 82 | 83 | } 84 | 85 | protected void onVisible() { 86 | lazyLoad(); 87 | } 88 | 89 | protected void lazyLoad() { 90 | if (!isVisible || !isPrepared) { 91 | return; 92 | } 93 | setList(); 94 | } 95 | 96 | protected void onInvisible() { 97 | } 98 | 99 | protected void loadMore() { 100 | page++; 101 | setList(); 102 | 103 | } 104 | 105 | 106 | private void setList() { 107 | runnable = new Runnable() { 108 | @Override 109 | public void run() { 110 | int start = 20 * (page - 1); 111 | for (int i = start; i < page * 20; i++) { 112 | mDataList.add(mTitle + "," + getActivity().getString(R.string.test_data) + i); 113 | } 114 | mRecyclerViewAdapter.notifyDataSetChanged(); 115 | mPullLoadMoreRecyclerView.setPullLoadMoreCompleted(); 116 | } 117 | }; 118 | handler = new Handler(); 119 | handler.postDelayed(runnable, 500); 120 | 121 | 122 | } 123 | 124 | @Override 125 | public void onDestroy() { 126 | super.onDestroy(); 127 | if (handler != null) 128 | handler.removeCallbacks(runnable); 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/DetailActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.design.widget.CollapsingToolbarLayout; 7 | import android.support.design.widget.FloatingActionButton; 8 | import android.support.design.widget.Snackbar; 9 | import android.support.v4.app.ActivityCompat; 10 | import android.support.v4.app.ActivityOptionsCompat; 11 | import android.support.v4.view.ViewCompat; 12 | import android.support.v7.widget.Toolbar; 13 | import android.view.View; 14 | import android.widget.ImageView; 15 | 16 | /** 17 | * Created by 吴小龙同學 18 | * on 2015/11/16 19 | * 官网文档:https://material.google.com/ 20 | * 个人博客:http://wuxiaolong.me/ 21 | * 公众号:吴小龙同学 22 | */ 23 | public class DetailActivity extends BaseActivity { 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_detail); 29 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 30 | setSupportActionBar(toolbar); 31 | android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 32 | if (actionBar != null) { 33 | actionBar.setDisplayHomeAsUpEnabled(true); 34 | 35 | } 36 | CollapsingToolbarLayout collapsingToolbar = 37 | (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); 38 | collapsingToolbar.setTitle(getString(R.string.detail_title)); 39 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 40 | fab.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View view) { 43 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 44 | .setAction("Action", null).show(); 45 | 46 | } 47 | }); 48 | int position = this.getIntent().getIntExtra("position", 0); 49 | ImageView backdrop = (ImageView) findViewById(R.id.backdrop); 50 | //设置过渡动画 51 | ViewCompat.setTransitionName(backdrop, AppConstants.TRANSITION_PIC); 52 | if (position % 2 == 0) { 53 | backdrop.setBackgroundResource(R.mipmap.show_img1); 54 | } else { 55 | backdrop.setBackgroundResource(R.mipmap.show_img2); 56 | } 57 | } 58 | 59 | /** 60 | * @param showImage 共享的元素 61 | */ 62 | public static void startActivity(Activity activity, int position, ImageView showImage) { 63 | Intent intent = new Intent(); 64 | intent.setClass(activity, DetailActivity.class); 65 | intent.putExtra("position", position); 66 | ActivityOptionsCompat options = ActivityOptionsCompat 67 | .makeSceneTransitionAnimation(activity, showImage, AppConstants.TRANSITION_PIC); 68 | ActivityCompat.startActivity(activity, intent, options.toBundle()); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/FristFragment.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.support.annotation.Nullable; 8 | import android.support.design.widget.FloatingActionButton; 9 | import android.support.design.widget.TabLayout; 10 | import android.support.v4.app.Fragment; 11 | import android.support.v4.app.FragmentManager; 12 | import android.support.v4.app.FragmentPagerAdapter; 13 | import android.support.v4.view.ViewPager; 14 | import android.support.v7.widget.SearchView; 15 | import android.support.v7.widget.Toolbar; 16 | import android.view.LayoutInflater; 17 | import android.view.MenuItem; 18 | import android.view.View; 19 | import android.view.ViewGroup; 20 | 21 | import com.wuxiaolong.androidutils.library.LogUtil; 22 | 23 | import java.util.ArrayList; 24 | import java.util.List; 25 | 26 | /** 27 | * Created by 吴小龙同學 28 | * on 2016/9/11. 29 | * 官网文档:https://material.google.com/ 30 | * 个人博客:http://wuxiaolong.me/ 31 | * 公众号:吴小龙同学 32 | */ 33 | 34 | public class FristFragment extends BaseFragment { 35 | private Toolbar mToolbar; 36 | private FloatingActionButton fab; 37 | 38 | 39 | @Override 40 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 41 | Bundle savedInstanceState) { 42 | // Inflate the layout for this fragment 43 | return inflater.inflate(R.layout.fragment_frist, container, false); 44 | } 45 | 46 | 47 | @Override 48 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 49 | super.onViewCreated(view, savedInstanceState); 50 | fab = (FloatingActionButton) view.findViewById(R.id.fab); 51 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 52 | mToolbar.setTitle("首页"); 53 | //设置标题居中 54 | //mToolbar.setTitle(""); 55 | //TextView toolbarTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title); 56 | //toolbarTitle.setText("首页"); 57 | ((MainActivity) getActivity()).initDrawer(mToolbar); 58 | initTabLayout(view); 59 | inflateMenu(); 60 | initSearchView(); 61 | fab.setOnClickListener(new View.OnClickListener() { 62 | @Override 63 | public void onClick(View v) { 64 | startActivity(new Intent(mActivity, LoginActivity.class)); 65 | } 66 | }); 67 | } 68 | 69 | private void initSearchView() { 70 | final SearchView searchView = (SearchView) mToolbar.getMenu() 71 | .findItem(R.id.menu_search).getActionView(); 72 | searchView.setQueryHint("搜索…"); 73 | searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 74 | @Override 75 | public boolean onQueryTextSubmit(String query) { 76 | showToast("query=" + query); 77 | return false; 78 | } 79 | 80 | @Override 81 | public boolean onQueryTextChange(String s) { 82 | LogUtil.d("onQueryTextChange=" + s); 83 | // UserFeedback.show( "SearchOnQueryTextChanged: " + s); 84 | return false; 85 | } 86 | }); 87 | } 88 | 89 | private void inflateMenu() { 90 | mToolbar.inflateMenu(R.menu.menu_frist); 91 | mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 92 | @Override 93 | public boolean onMenuItemClick(MenuItem item) { 94 | switch (item.getItemId()) { 95 | case R.id.menu_about: 96 | Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/WuXiaolong/DesignSupportLibrarySample")); 97 | getActivity().startActivity(intent); 98 | break; 99 | } 100 | return true; 101 | } 102 | }); 103 | } 104 | 105 | 106 | private class FragmentViewPagerAdapter extends FragmentPagerAdapter { 107 | private final List mFragmentList = new ArrayList<>(); 108 | private final List mFragmentTitleList = new ArrayList<>(); 109 | 110 | public FragmentViewPagerAdapter(FragmentManager manager) { 111 | super(manager); 112 | } 113 | 114 | @Override 115 | public Fragment getItem(int position) { 116 | return mFragmentList.get(position); 117 | } 118 | 119 | @Override 120 | public int getCount() { 121 | return mFragmentList.size(); 122 | } 123 | 124 | public void addFrag(Fragment fragment, String title) { 125 | mFragmentList.add(fragment); 126 | mFragmentTitleList.add(title); 127 | } 128 | 129 | @Override 130 | public CharSequence getPageTitle(int position) { 131 | return mFragmentTitleList.get(position); 132 | } 133 | } 134 | 135 | private void initTabLayout(View view) { 136 | TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabLayout); 137 | ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPager); 138 | setupViewPager(viewPager); 139 | viewPager.setOffscreenPageLimit(viewPager.getAdapter().getCount()); 140 | // 设置ViewPager的数据等 141 | tabLayout.setupWithViewPager(viewPager); 142 | //适合很多tab 143 | //tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 144 | //tab均分,适合少的tab 145 | tabLayout.setTabMode(TabLayout.MODE_FIXED); 146 | //tab均分,适合少的tab,TabLayout.GRAVITY_CENTER 147 | //tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 148 | 149 | } 150 | 151 | private void setupViewPager(ViewPager viewPager) { 152 | FragmentViewPagerAdapter adapter = new FragmentViewPagerAdapter(getChildFragmentManager()); 153 | Fragment newfragment = new ContentFragment(); 154 | Bundle data = new Bundle(); 155 | data.putInt("id", 0); 156 | data.putString("title", getString(R.string.page1)); 157 | newfragment.setArguments(data); 158 | adapter.addFrag(newfragment, getString(R.string.page1)); 159 | 160 | newfragment = new ContentFragment(); 161 | data = new Bundle(); 162 | data.putInt("id", 1); 163 | data.putString("title", getString(R.string.page2)); 164 | newfragment.setArguments(data); 165 | adapter.addFrag(newfragment, getString(R.string.page2)); 166 | 167 | 168 | newfragment = new ContentFragment(); 169 | data = new Bundle(); 170 | data.putInt("id", 2); 171 | data.putString("title", getString(R.string.page3)); 172 | newfragment.setArguments(data); 173 | adapter.addFrag(newfragment, getString(R.string.page3)); 174 | 175 | 176 | viewPager.setAdapter(adapter); 177 | 178 | } 179 | 180 | } 181 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/LoginActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.design.widget.TextInputLayout; 6 | import android.text.TextUtils; 7 | import android.view.KeyEvent; 8 | import android.view.View; 9 | import android.view.View.OnClickListener; 10 | import android.view.inputmethod.EditorInfo; 11 | import android.widget.AutoCompleteTextView; 12 | import android.widget.Button; 13 | import android.widget.EditText; 14 | import android.widget.TextView; 15 | 16 | import com.wuxiaolong.androidutils.library.LogUtil; 17 | 18 | 19 | /** 20 | * Created by 吴小龙同學 21 | * on 2015/11/16 22 | * 官网文档:https://material.google.com/ 23 | * 个人博客:http://wuxiaolong.me/ 24 | * 公众号:吴小龙同学 25 | */ 26 | public class LoginActivity extends BaseActivity { 27 | 28 | private AutoCompleteTextView mEmailView; 29 | private EditText mPasswordView; 30 | private TextInputLayout emailTextInput, passwordTextInput; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_login); 36 | initToolbar("登录"); 37 | mEmailView = (AutoCompleteTextView) findViewById(R.id.email); 38 | mPasswordView = (EditText) findViewById(R.id.password); 39 | emailTextInput = (TextInputLayout) findViewById(R.id.emailTextInput); 40 | passwordTextInput = (TextInputLayout) findViewById(R.id.passwordTextInput); 41 | mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 42 | @Override 43 | public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { 44 | if (id == R.id.login || id == EditorInfo.IME_ACTION_DONE) { 45 | attemptLogin(); 46 | return true; 47 | } 48 | return false; 49 | } 50 | }); 51 | 52 | Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); 53 | mEmailSignInButton.setOnClickListener(new OnClickListener() { 54 | @Override 55 | public void onClick(View view) { 56 | attemptLogin(); 57 | } 58 | }); 59 | 60 | } 61 | 62 | 63 | private void attemptLogin() { 64 | LogUtil.d("attemptLogin"); 65 | // Reset errors. 66 | emailTextInput.setErrorEnabled(false); 67 | passwordTextInput.setErrorEnabled(false); 68 | 69 | String email = mEmailView.getText().toString(); 70 | String password = mPasswordView.getText().toString(); 71 | if (TextUtils.isEmpty(email)) { 72 | emailTextInput.setError("请输入邮箱"); 73 | return; 74 | } else if (!isEmailValid(email)) { 75 | emailTextInput.setError("请输入有效的邮箱"); 76 | return; 77 | } 78 | 79 | if (TextUtils.isEmpty(password)) { 80 | passwordTextInput.setError("请输入密码"); 81 | return; 82 | } else if (!isPasswordValid(password)) { 83 | passwordTextInput.setError("密码过短"); 84 | return; 85 | } 86 | 87 | 88 | mActivity.startActivity(new Intent(mActivity, MainActivity.class)); 89 | finish(); 90 | 91 | } 92 | 93 | private boolean isEmailValid(String email) { 94 | return email.contains("@"); 95 | } 96 | 97 | private boolean isPasswordValid(String password) { 98 | return password.length() > 4; 99 | } 100 | 101 | 102 | } 103 | 104 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.NavigationView; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.app.FragmentTransaction; 7 | import android.support.v4.widget.DrawerLayout; 8 | import android.support.v7.app.ActionBar; 9 | import android.support.v7.app.ActionBarDrawerToggle; 10 | import android.support.v7.app.AppCompatDelegate; 11 | import android.support.v7.widget.Toolbar; 12 | import android.view.Menu; 13 | import android.view.MenuItem; 14 | import android.view.View; 15 | import android.widget.TextView; 16 | 17 | import com.wuxiaolong.androidutils.library.LogUtil; 18 | import com.wuxiaolong.androidutils.library.SharedPreferencesUtil; 19 | 20 | /** 21 | * Created by 吴小龙同學 22 | * on 2015/11/16 23 | * 官网文档:https://material.google.com/ 24 | * 个人博客:http://wuxiaolong.me/ 25 | * 公众号:吴小龙同学 26 | */ 27 | 28 | public class MainActivity extends BaseActivity { 29 | private DrawerLayout mDrawerLayout; 30 | private ActionBarDrawerToggle mDrawerToggle; 31 | private NavigationView navigationView; 32 | private Fragment currentFragment; 33 | private int currentIndex; 34 | 35 | @Override 36 | protected void onCreate(Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | setContentView(R.layout.activity_main); 39 | mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 40 | initNavigationViewHeader(); 41 | initFragment(savedInstanceState); 42 | } 43 | 44 | private void initFragment(Bundle savedInstanceState) { 45 | if (savedInstanceState == null) { 46 | currentFragment = new FristFragment(); 47 | switchContent(currentFragment); 48 | } else { 49 | //activity销毁后记住销毁前所在页面,用于夜间模式切换 50 | currentIndex = savedInstanceState.getInt(AppConstants.CURRENT_INDEX); 51 | switch (this.currentIndex) { 52 | case 0: 53 | currentFragment = new FristFragment(); 54 | switchContent(currentFragment); 55 | break; 56 | case 1: 57 | currentFragment = new SecondFragment(); 58 | switchContent(currentFragment); 59 | break; 60 | case 2: 61 | currentFragment = new ThirdFragment(); 62 | switchContent(currentFragment); 63 | break; 64 | } 65 | } 66 | } 67 | 68 | public void initDrawer(Toolbar toolbar) { 69 | if (toolbar != null) { 70 | mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open, R.string.close) { 71 | @Override 72 | public void onDrawerOpened(View drawerView) { 73 | super.onDrawerOpened(drawerView); 74 | } 75 | 76 | @Override 77 | public void onDrawerClosed(View drawerView) { 78 | super.onDrawerClosed(drawerView); 79 | } 80 | }; 81 | mDrawerToggle.syncState(); 82 | ActionBar actionBar = getSupportActionBar(); 83 | if (actionBar != null) { 84 | //更换 85 | actionBar.setHomeAsUpIndicator(R.mipmap.ic_launcher); 86 | } 87 | mDrawerLayout.addDrawerListener(mDrawerToggle); 88 | } 89 | } 90 | 91 | private void initNavigationViewHeader() { 92 | navigationView = (NavigationView) findViewById(R.id.navigation); 93 | //设置头像,布局app:headerLayout="@layout/drawer_header"所指定的头布局 94 | View view = navigationView.inflateHeaderView(R.layout.drawer_header); 95 | TextView userName = (TextView) view.findViewById(R.id.userName); 96 | userName.setText(R.string.author); 97 | //View mNavigationViewHeader = View.inflate(MainActivity.this, R.layout.drawer_header, null); 98 | //navigationView.addHeaderView(mNavigationViewHeader);//此方法在魅族note 1,头像显示不全 99 | //菜单点击事件 100 | navigationView.setNavigationItemSelectedListener(new NavigationItemSelected()); 101 | } 102 | 103 | class NavigationItemSelected implements NavigationView.OnNavigationItemSelectedListener { 104 | @Override 105 | public boolean onNavigationItemSelected(MenuItem menuItem) { 106 | mDrawerLayout.closeDrawers(); 107 | switch (menuItem.getItemId()) { 108 | case R.id.navigation_item_1: 109 | currentIndex = 0; 110 | menuItem.setChecked(true); 111 | currentFragment = new FristFragment(); 112 | switchContent(currentFragment); 113 | return true; 114 | case R.id.navigation_item_2: 115 | currentIndex = 2; 116 | menuItem.setChecked(true); 117 | currentFragment = new ThirdFragment(); 118 | switchContent(currentFragment); 119 | return true; 120 | case R.id.navigation_item_3: 121 | currentIndex = 1; 122 | menuItem.setChecked(true); 123 | currentFragment = new SecondFragment(); 124 | switchContent(currentFragment); 125 | return true; 126 | case R.id.navigation_item_night: 127 | SharedPreferencesUtil.setBoolean(mActivity, AppConstants.ISNIGHT, true); 128 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); 129 | recreate(); 130 | return true; 131 | case R.id.navigation_item_day: 132 | SharedPreferencesUtil.setBoolean(mActivity, AppConstants.ISNIGHT, false); 133 | AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); 134 | recreate(); 135 | return true; 136 | default: 137 | return true; 138 | } 139 | } 140 | } 141 | 142 | public void switchContent(Fragment fragment) { 143 | FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 144 | fragmentTransaction.replace(R.id.contentLayout, fragment).commit(); 145 | invalidateOptionsMenu(); 146 | } 147 | 148 | @Override 149 | protected void onSaveInstanceState(Bundle outState) { 150 | LogUtil.d("onSaveInstanceState=" + currentIndex); 151 | outState.putInt(AppConstants.CURRENT_INDEX, currentIndex); 152 | super.onSaveInstanceState(outState); 153 | } 154 | 155 | @Override 156 | public boolean onCreateOptionsMenu(Menu menu) { 157 | // Inflate the menu; this adds items to the action bar if it is present. 158 | getMenuInflater().inflate(R.menu.menu_main, menu); 159 | return true; 160 | } 161 | 162 | @Override 163 | public boolean onOptionsItemSelected(MenuItem item) { 164 | // Handle action bar item clicks here. The action bar will 165 | // automatically handle clicks on the Home/Up button, so long 166 | // as you specify a parent activity in AndroidManifest.xml. 167 | int id = item.getItemId(); 168 | 169 | switch (id) { 170 | case R.id.action_about: 171 | break; 172 | default: 173 | //对没有处理的事件,交给父类来处理 174 | return super.onOptionsItemSelected(item); 175 | 176 | } 177 | 178 | return true; 179 | } 180 | 181 | 182 | } 183 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/RecyclerViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.app.Activity; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * Created by 吴小龙同學 15 | * on 2016/9/11. 16 | * 官网文档:https://material.google.com/ 17 | * 个人博客:http://wuxiaolong.me/ 18 | * 公众号:吴小龙同学 19 | */ 20 | public class RecyclerViewAdapter extends RecyclerView.Adapter { 21 | private List dataList; 22 | private Activity mActivity; 23 | 24 | RecyclerViewAdapter(Activity activity, List dataList) { 25 | this.dataList = dataList; 26 | this.mActivity = activity; 27 | } 28 | 29 | @Override 30 | public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 31 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false); 32 | return new ViewHolder(view); 33 | } 34 | 35 | @Override 36 | public void onBindViewHolder(ViewHolder holder, int position) { 37 | holder.title.setText(dataList.get(position).split(",")[0]); 38 | holder.content.setText(dataList.get(position).split(",")[1]); 39 | if (position % 2 == 0) { 40 | holder.showImage.setBackgroundResource(R.mipmap.show_img1); 41 | } else { 42 | holder.showImage.setBackgroundResource(R.mipmap.show_img2); 43 | } 44 | } 45 | 46 | @Override 47 | public int getItemCount() { 48 | return dataList.size(); 49 | } 50 | 51 | public class ViewHolder extends RecyclerView.ViewHolder { 52 | TextView title, content; 53 | ImageView showImage; 54 | 55 | public ViewHolder(View itemView) { 56 | super(itemView); 57 | title = (TextView) itemView.findViewById(R.id.title); 58 | content = (TextView) itemView.findViewById(R.id.content); 59 | showImage = (ImageView) itemView.findViewById(R.id.showImage); 60 | itemView.setOnClickListener(new View.OnClickListener() { 61 | @Override 62 | public void onClick(View v) { 63 | DetailActivity.startActivity(mActivity, getLayoutPosition(), showImage); 64 | } 65 | }); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/SecondFragment.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.support.annotation.Nullable; 8 | import android.support.v4.app.Fragment; 9 | import android.support.v7.widget.Toolbar; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | 14 | /** 15 | * Created by 吴小龙同學 16 | * on 2015/11/16 17 | * 官网文档:https://material.google.com/ 18 | * 个人博客:http://wuxiaolong.me/ 19 | * 公众号:吴小龙同学 20 | */ 21 | public class SecondFragment extends Fragment { 22 | private Toolbar mToolbar; 23 | 24 | @Override 25 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 26 | Bundle savedInstanceState) { 27 | // Inflate the layout for this fragment 28 | return inflater.inflate(R.layout.fragment_second, container, false); 29 | } 30 | 31 | @Override 32 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 33 | super.onViewCreated(view, savedInstanceState); 34 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 35 | mToolbar.setTitle("吴小龙"); 36 | ((MainActivity) getActivity()).initDrawer(mToolbar); 37 | view.findViewById(R.id.weixin).setOnClickListener(new View.OnClickListener() { 38 | @Override 39 | public void onClick(View v) { 40 | toWebView("http://weixin.sogou.com/weixin?type=1&query=吴小龙同学"); 41 | } 42 | }); 43 | view.findViewById(R.id.blog).setOnClickListener(new View.OnClickListener() { 44 | @Override 45 | public void onClick(View v) { 46 | toWebView("http://wuxiaolong.me/"); 47 | } 48 | }); 49 | view.findViewById(R.id.github).setOnClickListener(new View.OnClickListener() { 50 | @Override 51 | public void onClick(View v) { 52 | toWebView("https://github.com/WuXiaolong/"); 53 | } 54 | }); 55 | } 56 | 57 | private void toWebView(String url) { 58 | Uri uri = Uri.parse(url); 59 | startActivity(new Intent(Intent.ACTION_VIEW, uri)); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/TabLayoutActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.TabLayout; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | public class TabLayoutActivity extends AppCompatActivity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_tab_layout); 15 | TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout); 16 | tabLayout.addTab(tabLayout.newTab().setText("Tab3")); 17 | 18 | 19 | View view = View.inflate(this, R.layout.custom_tab1, null); 20 | TextView tabText = (TextView) view.findViewById(R.id.tabText); 21 | tabText.setText("Tab4"); 22 | TextView tabPoint = (TextView) view.findViewById(R.id.tabPoint); 23 | tabPoint.setText("9"); 24 | tabLayout.addTab(tabLayout.newTab().setCustomView(view)); 25 | 26 | tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 27 | @Override 28 | public void onTabSelected(TabLayout.Tab tab) { 29 | 30 | } 31 | 32 | @Override 33 | public void onTabUnselected(TabLayout.Tab tab) { 34 | 35 | } 36 | 37 | @Override 38 | public void onTabReselected(TabLayout.Tab tab) { 39 | 40 | } 41 | }); 42 | 43 | } 44 | int dpToPx(int dps) { 45 | return Math.round(getResources().getDisplayMetrics().density * dps); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/designsupportlibrarysample/ThirdFragment.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.designsupportlibrarysample; 2 | 3 | 4 | import android.content.DialogInterface; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.support.annotation.Nullable; 8 | import android.support.design.widget.BottomSheetDialog; 9 | import android.support.design.widget.Snackbar; 10 | import android.support.v7.app.AlertDialog; 11 | import android.support.v7.widget.SwitchCompat; 12 | import android.support.v7.widget.Toolbar; 13 | import android.view.LayoutInflater; 14 | import android.view.View; 15 | import android.view.ViewGroup; 16 | import android.widget.CheckBox; 17 | import android.widget.RadioButton; 18 | import android.widget.SeekBar; 19 | 20 | /** 21 | * Created by 吴小龙同學 22 | * on 2015/11/16 23 | * 官网文档:https://material.google.com/ 24 | * 个人博客:http://wuxiaolong.me/ 25 | * 公众号:吴小龙同学 26 | */ 27 | public class ThirdFragment extends BaseFragment { 28 | private Toolbar mToolbar; 29 | private View thirdLayout; 30 | private SwitchCompat switchCompat; 31 | private CheckBox checkBox; 32 | private RadioButton radiobutton; 33 | private SeekBar seekBar; 34 | 35 | @Override 36 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 37 | Bundle savedInstanceState) { 38 | // Inflate the layout for this fragment 39 | return inflater.inflate(R.layout.fragment_third, container, false); 40 | } 41 | 42 | @Override 43 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 44 | super.onViewCreated(view, savedInstanceState); 45 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 46 | mToolbar.setTitle("其他组件"); 47 | ((MainActivity) getActivity()).initDrawer(mToolbar); 48 | thirdLayout = view.findViewById(R.id.thirdLayout); 49 | switchCompat = (SwitchCompat) view.findViewById(R.id.switchCompat); 50 | checkBox = (CheckBox) view.findViewById(R.id.checkbox); 51 | radiobutton = (RadioButton) view.findViewById(R.id.radiobutton); 52 | seekBar = (SeekBar) view.findViewById(R.id.seekBar); 53 | view.findViewById(R.id.tabLayout).setOnClickListener(new View.OnClickListener() { 54 | @Override 55 | public void onClick(View v) { 56 | startActivity(new Intent(mActivity, TabLayoutActivity.class)); 57 | } 58 | }); 59 | view.findViewById(R.id.bottomNavigation).setOnClickListener(new View.OnClickListener() { 60 | @Override 61 | public void onClick(View v) { 62 | startActivity(new Intent(mActivity, BottomNavigationActivity.class)); 63 | } 64 | }); 65 | view.findViewById(R.id.snackbars).setOnClickListener(new View.OnClickListener() { 66 | @Override 67 | public void onClick(View v) { 68 | Snackbar.make(thirdLayout, "Snackbar Test", Snackbar.LENGTH_SHORT).show(); 69 | } 70 | }); 71 | view.findViewById(R.id.bottomSheetDialog).setOnClickListener(new View.OnClickListener() { 72 | @Override 73 | public void onClick(View v) { 74 | showBottomSheetDialog(); 75 | } 76 | }); 77 | view.findViewById(R.id.dialogs).setOnClickListener(new View.OnClickListener() { 78 | @Override 79 | public void onClick(View v) { 80 | showDialogs(); 81 | } 82 | }); 83 | view.findViewById(R.id.switchCompatLayout).setOnClickListener(new View.OnClickListener() { 84 | @Override 85 | public void onClick(View v) { 86 | switchCompat.setChecked(!switchCompat.isChecked()); 87 | } 88 | }); 89 | view.findViewById(R.id.checkboxLayout).setOnClickListener(new View.OnClickListener() { 90 | @Override 91 | public void onClick(View v) { 92 | checkBox.setChecked(!checkBox.isChecked()); 93 | } 94 | }); 95 | view.findViewById(R.id.radiobuttonLayout).setOnClickListener(new View.OnClickListener() { 96 | @Override 97 | public void onClick(View v) { 98 | radiobutton.setChecked(!radiobutton.isChecked()); 99 | } 100 | }); 101 | seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 102 | @Override 103 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 104 | Snackbar.make(thirdLayout, "progress=" + progress, Snackbar.LENGTH_SHORT).show(); 105 | } 106 | 107 | @Override 108 | public void onStartTrackingTouch(SeekBar seekBar) { 109 | 110 | } 111 | 112 | @Override 113 | public void onStopTrackingTouch(SeekBar seekBar) { 114 | 115 | } 116 | }); 117 | } 118 | 119 | private BottomSheetDialog mBottomSheetDialog; 120 | 121 | public void showBottomSheetDialog() { 122 | View sheetDialogView = View.inflate(mActivity, R.layout.sheet_dialog, null); 123 | mBottomSheetDialog = new BottomSheetDialog(mActivity); 124 | mBottomSheetDialog.setContentView(sheetDialogView); 125 | mBottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 126 | @Override 127 | public void onDismiss(DialogInterface dialog) { 128 | mBottomSheetDialog = null; 129 | } 130 | }); 131 | mBottomSheetDialog.show(); 132 | } 133 | 134 | public void showDialogs() { 135 | AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 136 | builder.setTitle("Title"); 137 | builder.setMessage("Message"); 138 | builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 139 | @Override 140 | public void onClick(DialogInterface dialog, int which) { 141 | 142 | } 143 | }); 144 | builder.show(); 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /app/src/main/res/color/bottom_item_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/custom_tab_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/item_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_tab_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_copy_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_link_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mode_edit_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_preview_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_24dp.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_point_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_app_shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 |