master 857afc9447df cached
48 files
74.9 KB
23.8k tokens
54 symbols
1 requests
Download .txt
Repository: opengit/AndroidNewWidgetsDemo
Branch: master
Commit: 857afc9447df
Files: 48
Total size: 74.9 KB

Directory structure:
gitextract_zt7kdd55/

├── .gitignore
├── .idea/
│   ├── .name
│   ├── compiler.xml
│   ├── copyright/
│   │   ├── monkey.xml
│   │   └── profiles_settings.xml
│   ├── encodings.xml
│   ├── gradle.xml
│   ├── misc.xml
│   ├── modules.xml
│   ├── runConfigurations.xml
│   └── vcs.xml
├── AndroidNewWidgetsDemo.iml
├── README.md
├── app/
│   ├── .gitignore
│   ├── app.iml
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── sunjiajia/
│       │               └── androidnewwidgetsdemo/
│       │                   └── ApplicationTest.java
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── sunjiajia/
│           │           └── androidnewwidgetsdemo/
│           │               ├── MyActivity.java
│           │               ├── MyFragment.java
│           │               ├── adapter/
│           │               │   ├── MyRecyclerViewAdapter.java
│           │               │   ├── MyRecyclerViewHolder.java
│           │               │   ├── MyStaggeredViewAdapter.java
│           │               │   └── MyViewPagerAdapter.java
│           │               ├── utils/
│           │               │   └── SnackbarUtil.java
│           │               └── view/
│           │                   └── RoundedImageView.java
│           └── res/
│               ├── color/
│               │   └── selector_nav_menu_textcolor.xml
│               ├── layout/
│               │   ├── activity_my.xml
│               │   ├── content_main.xml
│               │   ├── content_main_collapsing.xml
│               │   ├── frag_main.xml
│               │   ├── header_nav.xml
│               │   └── item_main.xml
│               ├── menu/
│               │   ├── menu_my.xml
│               │   └── menu_nav.xml
│               └── values/
│                   ├── arrays.xml
│                   ├── colors.xml
│                   ├── dimens.xml
│                   ├── strings.xml
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures


================================================
FILE: .idea/.name
================================================
AndroidNewWidgetsDemo

================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <resourceExtensions />
    <wildcardResourcePatterns>
      <entry name="!?*.java" />
      <entry name="!?*.form" />
      <entry name="!?*.class" />
      <entry name="!?*.groovy" />
      <entry name="!?*.scala" />
      <entry name="!?*.flex" />
      <entry name="!?*.kt" />
      <entry name="!?*.clj" />
      <entry name="!?*.aj" />
    </wildcardResourcePatterns>
    <annotationProcessing>
      <profile default="true" name="Default" enabled="false">
        <processorPath useClasspath="true" />
      </profile>
    </annotationProcessing>
  </component>
</project>

================================================
FILE: .idea/copyright/monkey.xml
================================================
<component name="CopyrightManager">
  <copyright>
    <option name="myName" value="monkey" />
    <option name="notice" value="/*&#10; *&#10; *  *&#10; *  *  * ===================================&#10; *  *  * Copyright (c) 2016.&#10; *  *  * 作者:安卓猴&#10; *  *  * 微博:@安卓猴&#10; *  *  * 博客:http://sunjiajia.com&#10; *  *  * Github:https://github.com/opengit&#10; *  *  *&#10; *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。&#10; *  *  * ===================================&#10; *  *&#10; *  *&#10; *&#10; */" />
  </copyright>
</component>

================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
  <settings default="monkey">
    <module2copyright>
      <element module="All" copyright="monkey" />
    </module2copyright>
  </settings>
</component>

================================================
FILE: .idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
    <file url="PROJECT" charset="UTF-8" />
  </component>
</project>

================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="distributionType" value="LOCAL" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.10" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="myModules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="EntryPointsManager">
    <entry_points version="2.0" />
  </component>
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
    <OptionsSetting value="true" id="Add" />
    <OptionsSetting value="true" id="Remove" />
    <OptionsSetting value="true" id="Checkout" />
    <OptionsSetting value="true" id="Update" />
    <OptionsSetting value="true" id="Status" />
    <OptionsSetting value="true" id="Edit" />
    <ConfirmationsSetting value="0" id="Add" />
    <ConfirmationsSetting value="0" id="Remove" />
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
  <component name="masterDetails">
    <states>
      <state key="Copyright.UI">
        <settings>
          <last-edited>monkey</last-edited>
          <splitter-proportions>
            <option name="proportions">
              <list>
                <option value="0.2" />
              </list>
            </option>
          </splitter-proportions>
        </settings>
      </state>
    </states>
  </component>
</project>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/AndroidNewWidgetsDemo.iml" filepath="$PROJECT_DIR$/AndroidNewWidgetsDemo.iml" />
      <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
      </set>
    </option>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: AndroidNewWidgetsDemo.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="AndroidNewWidgetsDemo" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="java-gradle" name="Java-Gradle">
      <configuration>
        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
        <option name="BUILDABLE" value="false" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

================================================
FILE: README.md
================================================
# 一个Demo学会用Android兼容包新控件

伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我们结合v7和v4中的几个控件,来主要学习Design Support Library中的几个新控件!一个Demo学会用它们!

####效果动图GIF:
![Design Support Library Demo](https://blog.sunjiajia.com/img/201507/android-new-widgets-demo.gif)


**通过本实例可以学习到以下内容:**

* Drawerlayout和NavigationView实现优雅的Google范儿侧边栏;
* 新控件CoordinatorLayout、AppBarLayout、Toolbar、FloatingActionButton的用法,以及Toolbar的渐变隐藏动画效果;
* 官方Tabs组件TabLayout和ViewPager结合实现主界面内容区域;
* SwipeRefreshLayout和RecyclerView结合实现下拉刷新,以及RecyclerView的数据适配器RecyclerView.Adapter<ViewHolder>的用法,还有RecyclerView中item的点击事件的实现方法;
* 卡片式CardView的用法;
* 类似Toast的新控件Snackbar的用法。


> 在源码中学习Android,是有种身临其境的感觉的。

> 整个Demo的源码我放在了GitHub上,谢谢star一下~
> 在看源码过程中如果发现什么问题,请在博客留言,看到一定回复。

> 源码地址:
> [AndroidNewWidgetsDemo](https://github.com/git0pen/AndroidNewWidgetsDemo)

> 博文地址:
> [AndroidNewWidgetsDemo](https://blog.sunjiajia.com/2015/07/02/android-new-widgets-demo/)


**2016.04.29**

* 更新所有兼容包到23.3.0
* RecyclerView中的Item水平居中并match_parent
* Fab添加了margin值,并更换了颜色

**2016.07.14**

* 更新所有依赖包到最新版本

## 微信公众号:Android奇想录(android_amazing)

![Android奇想录](https://blog.sunjiajia.com/img/qrcode_for_android_amazing.jpg)


================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/app.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="AndroidNewWidgetsDemo" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":app" />
      </configuration>
    </facet>
    <facet type="android" name="Android">
      <configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
        <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
        <afterSyncTasks>
          <task>generateDebugSources</task>
        </afterSyncTasks>
        <option name="ALLOW_USER_CONFIGURATION" value="false" />
        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/cardview-v7/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/design/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/24.0.0/jars" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
    </content>
    <orderEntry type="jdk" jdkName="Android API 24 Platform" jdkType="Android SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" exported="" name="recyclerview-v7-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="design-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="appcompat-v7-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="cardview-v7-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="support-annotations-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="support-v4-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="support-vector-drawable-24.0.0" level="project" />
    <orderEntry type="library" exported="" name="animated-vector-drawable-24.0.0" level="project" />
  </component>
</module>

================================================
FILE: app/build.gradle
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

apply plugin: 'com.android.application'

android {
  compileSdkVersion 24
  buildToolsVersion '24.0.0'

  defaultConfig {
    applicationId "com.sunjiajia.androidnewwidgetsdemo"
    minSdkVersion 14
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:24.0.0'
  compile 'com.android.support:design:24.0.0'
  compile 'com.android.support:cardview-v7:24.0.0'
  compile 'com.android.support:recyclerview-v7:24.0.0'
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\android\android-sdk-windows\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: app/src/androidTest/java/com/sunjiajia/androidnewwidgetsdemo/ApplicationTest.java
================================================
package com.sunjiajia.androidnewwidgetsdemo;

import android.app.Application;
import android.test.ApplicationTestCase;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }
}

================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sunjiajia.androidnewwidgetsdemo">

  <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme">
    <activity
        android:name=".MyActivity"
        android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
  </application>

</manifest>


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyActivity.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo;

import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.design.widget.TabLayout.TabLayoutOnPageChangeListener;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.RotateAnimation;

import com.sunjiajia.androidnewwidgetsdemo.adapter.MyViewPagerAdapter;
import com.sunjiajia.androidnewwidgetsdemo.utils.SnackbarUtil;

import java.util.ArrayList;
import java.util.List;

import static android.support.design.widget.TabLayout.*;

public class MyActivity extends AppCompatActivity
    implements ViewPager.OnPageChangeListener, OnClickListener {

  //初始化各种控件,照着xml中的顺序写
  private DrawerLayout mDrawerLayout;
  private CoordinatorLayout mCoordinatorLayout;
  private AppBarLayout mAppBarLayout;
  private Toolbar mToolbar;
  private TabLayout mTabLayout;
  private ViewPager mViewPager;
  private FloatingActionButton mFloatingActionButton;
  private NavigationView mNavigationView;

  // TabLayout中的tab标题
  private String[] mTitles;
  // 填充到ViewPager中的Fragment
  private List<Fragment> mFragments;
  // ViewPager的数据适配器
  private MyViewPagerAdapter mViewPagerAdapter;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    // 初始化各种控件
    initViews();

    // 初始化mTitles、mFragments等ViewPager需要的数据
    //这里的数据都是模拟出来了,自己手动生成的,在项目中需要从网络获取数据
    initData();

    // 对各种控件进行设置、适配、填充数据
    configViews();
  }

  private void initData() {

    // Tab的标题采用string-array的方法保存,在res/values/arrays.xml中写
    mTitles = getResources().getStringArray(R.array.tab_titles);

    //初始化填充到ViewPager中的Fragment集合
    mFragments = new ArrayList<>();
    for (int i = 0; i < mTitles.length; i++) {
      Bundle mBundle = new Bundle();
      mBundle.putInt("flag", i);
      MyFragment mFragment = new MyFragment();
      mFragment.setArguments(mBundle);
      mFragments.add(i, mFragment);
    }
  }

  private void configViews() {

    // 设置显示Toolbar
    setSupportActionBar(mToolbar);

    // 设置Drawerlayout开关指示器,即Toolbar最左边的那个icon
    ActionBarDrawerToggle mActionBarDrawerToggle =
        new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close);
    mActionBarDrawerToggle.syncState();
    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);

    //给NavigationView填充顶部区域,也可在xml中使用app:headerLayout="@layout/header_nav"来设置
    mNavigationView.inflateHeaderView(R.layout.header_nav);
    //给NavigationView填充Menu菜单,也可在xml中使用app:menu="@menu/menu_nav"来设置
    mNavigationView.inflateMenu(R.menu.menu_nav);

    // 自己写的方法,设置NavigationView中menu的item被选中后要执行的操作
    onNavgationViewMenuItemSelected(mNavigationView);

    // 初始化ViewPager的适配器,并设置给它
    mViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager(), mTitles, mFragments);
    mViewPager.setAdapter(mViewPagerAdapter);
    // 设置ViewPager最大缓存的页面个数
    mViewPager.setOffscreenPageLimit(5);
    // 给ViewPager添加页面动态监听器(为了让Toolbar中的Title可以变化相应的Tab的标题)
    mViewPager.addOnPageChangeListener(this);

    mTabLayout.setTabMode(MODE_SCROLLABLE);
    // 将TabLayout和ViewPager进行关联,让两者联动起来
    mTabLayout.setupWithViewPager(mViewPager);
    // 设置Tablayout的Tab显示ViewPager的适配器中的getPageTitle函数获取到的标题
    mTabLayout.setTabsFromPagerAdapter(mViewPagerAdapter);

    // 设置FloatingActionButton的点击事件
    mFloatingActionButton.setOnClickListener(this);
  }

  /**
   * 设置NavigationView中menu的item被选中后要执行的操作
   *
   * @param mNav
   */
  private void onNavgationViewMenuItemSelected(NavigationView mNav) {
    mNav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
      @Override public boolean onNavigationItemSelected(MenuItem menuItem) {

        String msgString = "";

        switch (menuItem.getItemId()) {
          case R.id.nav_menu_home:
            msgString = (String) menuItem.getTitle();
            break;
          case R.id.nav_menu_categories:
            msgString = (String) menuItem.getTitle();
            break;
          case R.id.nav_menu_feedback:
            msgString = (String) menuItem.getTitle();
            break;
          case R.id.nav_menu_setting:
            msgString = (String) menuItem.getTitle();
            break;
        }

        // Menu item点击后选中,并关闭Drawerlayout
        menuItem.setChecked(true);
        mDrawerLayout.closeDrawers();

        // android-support-design兼容包中新添加的一个类似Toast的控件。
        SnackbarUtil.show(mViewPager, msgString, 0);

        return true;
      }
    });
  }

  private void initViews() {
    mDrawerLayout = (DrawerLayout) findViewById(R.id.id_drawerlayout);
    mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.id_coordinatorlayout);
    mAppBarLayout = (AppBarLayout) findViewById(R.id.id_appbarlayout);
    mToolbar = (Toolbar) findViewById(R.id.id_toolbar);
    mTabLayout = (TabLayout) findViewById(R.id.id_tablayout);
    mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
    mFloatingActionButton = (FloatingActionButton) findViewById(R.id.id_floatingactionbutton);
    mNavigationView = (NavigationView) findViewById(R.id.id_navigationview);
  }

  @Override public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_my, menu);
    return true;
  }

  @Override public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_settings) {
      return true;
    }

    return super.onOptionsItemSelected(item);
  }

  @Override public void onPageSelected(int position) {
    mToolbar.setTitle(mTitles[position]);
  }

  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

  }

  @Override public void onPageScrollStateChanged(int state) {

  }

  @Override public void onClick(View v) {
    switch (v.getId()) {
      // FloatingActionButton的点击事件
      case R.id.id_floatingactionbutton:
        SnackbarUtil.show(v, getString(R.string.plusone), 0);
        break;
    }
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyFragment.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo;

import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.sunjiajia.androidnewwidgetsdemo.adapter.MyRecyclerViewAdapter;
import com.sunjiajia.androidnewwidgetsdemo.adapter.MyStaggeredViewAdapter;
import com.sunjiajia.androidnewwidgetsdemo.utils.SnackbarUtil;

/**
 * Created by Monkey on 2015/6/29.
 */
public class MyFragment extends Fragment
    implements SwipeRefreshLayout.OnRefreshListener, MyRecyclerViewAdapter.OnItemClickListener,
    MyStaggeredViewAdapter.OnItemClickListener {

  private View mView;
  private SwipeRefreshLayout mSwipeRefreshLayout;
  private RecyclerView mRecyclerView;
  private RecyclerView.LayoutManager mLayoutManager;
  private MyRecyclerViewAdapter mRecyclerViewAdapter;
  private MyStaggeredViewAdapter mStaggeredAdapter;

  private static final int VERTICAL_LIST = 0;
  private static final int HORIZONTAL_LIST = 1;
  private static final int VERTICAL_GRID = 2;
  private static final int HORIZONTAL_GRID = 3;
  private static final int STAGGERED_GRID = 4;

  private static final int SPAN_COUNT = 2;
  private int flag = 0;

  @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.frag_main, container, false);
    return mView;
  }

  @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.id_swiperefreshlayout);
    mRecyclerView = (RecyclerView) mView.findViewById(R.id.id_recyclerview);

    flag = (int) getArguments().get("flag");
    configRecyclerView();

    // 刷新时,指示器旋转后变化的颜色
    mSwipeRefreshLayout.setColorSchemeResources(R.color.main_blue_light, R.color.main_blue_dark);
    mSwipeRefreshLayout.setOnRefreshListener(this);
  }

  private void configRecyclerView() {

    switch (flag) {
      case VERTICAL_LIST:
        mLayoutManager =
            new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        break;
      case HORIZONTAL_LIST:
        mLayoutManager =
            new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        break;
      case VERTICAL_GRID:
        mLayoutManager =
            new GridLayoutManager(getActivity(), SPAN_COUNT, GridLayoutManager.VERTICAL, false);
        break;
      case HORIZONTAL_GRID:
        mLayoutManager =
            new GridLayoutManager(getActivity(), SPAN_COUNT, GridLayoutManager.HORIZONTAL, false);
        break;
      case STAGGERED_GRID:
        mLayoutManager =
            new StaggeredGridLayoutManager(SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
        break;
    }

    if (flag != STAGGERED_GRID) {
      mRecyclerViewAdapter = new MyRecyclerViewAdapter(getActivity());
      mRecyclerViewAdapter.setOnItemClickListener(this);
      mRecyclerView.setAdapter(mRecyclerViewAdapter);
    } else {
      mStaggeredAdapter = new MyStaggeredViewAdapter(getActivity());
      mStaggeredAdapter.setOnItemClickListener(this);
      mRecyclerView.setAdapter(mStaggeredAdapter);
    }

    mRecyclerView.setLayoutManager(mLayoutManager);
  }

  @Override public void onRefresh() {

    // 刷新时模拟数据的变化
    new Handler().postDelayed(new Runnable() {
      @Override public void run() {
        mSwipeRefreshLayout.setRefreshing(false);
        int temp = (int) (Math.random() * 10);
        if (flag != STAGGERED_GRID) {
          mRecyclerViewAdapter.mDatas.add(0, "new" + temp);
          mRecyclerViewAdapter.notifyDataSetChanged();
        } else {
          mStaggeredAdapter.mDatas.add(0, "new" + temp);
          mStaggeredAdapter.mHeights.add(0, (int) (Math.random() * 300) + 200);
          mStaggeredAdapter.notifyDataSetChanged();
        }
      }
    }, 1000);
  }

  @Override public void onItemClick(View view, int position) {
    SnackbarUtil.show(mRecyclerView, getString(R.string.item_clicked), 0);
  }

  @Override public void onItemLongClick(View view, int position) {
    SnackbarUtil.show(mRecyclerView, getString(R.string.item_longclicked), 0);
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewAdapter.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.sunjiajia.androidnewwidgetsdemo.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Monkey on 2015/6/29.
 */
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewHolder> {

  public interface OnItemClickListener {
    void onItemClick(View view, int position);

    void onItemLongClick(View view, int position);
  }

  public OnItemClickListener mOnItemClickListener;

  public void setOnItemClickListener(OnItemClickListener listener) {
    this.mOnItemClickListener = listener;
  }

  public Context mContext;
  public List<String> mDatas;
  public LayoutInflater mLayoutInflater;

  public MyRecyclerViewAdapter(Context mContext) {
    this.mContext = mContext;
    mLayoutInflater = LayoutInflater.from(mContext);
    mDatas = new ArrayList<>();
    for (int i = 'A'; i <= 'z'; i++) {
      mDatas.add((char) i + "");
    }
  }

  /**
   * 创建ViewHolder
   */
  @Override public MyRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View mView = mLayoutInflater.inflate(R.layout.item_main, parent, false);
    MyRecyclerViewHolder mViewHolder = new MyRecyclerViewHolder(mView);
    return mViewHolder;
  }

  /**
   * 绑定ViewHoler,给item中的控件设置数据
   */
  @Override public void onBindViewHolder(final MyRecyclerViewHolder holder, final int position) {
    if (mOnItemClickListener != null) {
      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
          mOnItemClickListener.onItemClick(holder.itemView, position);
        }
      });

      holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override public boolean onLongClick(View v) {
          mOnItemClickListener.onItemLongClick(holder.itemView, position);
          return true;
        }
      });
    }

    holder.mTextView.setText(mDatas.get(position));
  }

  @Override public int getItemCount() {
    return mDatas.size();
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewHolder.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.adapter;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

import com.sunjiajia.androidnewwidgetsdemo.R;

/**
 * Created by Monkey on 2015/6/29.
 */
public class MyRecyclerViewHolder extends RecyclerView.ViewHolder {

  public TextView mTextView;

  public MyRecyclerViewHolder(View itemView) {
    super(itemView);
    mTextView = (TextView) itemView.findViewById(R.id.id_textview);
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyStaggeredViewAdapter.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.sunjiajia.androidnewwidgetsdemo.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Monkey on 2015/6/29.
 */
public class MyStaggeredViewAdapter extends RecyclerView.Adapter<MyRecyclerViewHolder> {

  public interface OnItemClickListener {
    void onItemClick(View view, int position);

    void onItemLongClick(View view, int position);
  }

  public OnItemClickListener mOnItemClickListener;

  public void setOnItemClickListener(OnItemClickListener listener) {
    this.mOnItemClickListener = listener;
  }

  public Context mContext;
  public List<String> mDatas;
  public List<Integer> mHeights;
  public LayoutInflater mLayoutInflater;

  public MyStaggeredViewAdapter(Context mContext) {
    this.mContext = mContext;
    mLayoutInflater = LayoutInflater.from(mContext);
    mDatas = new ArrayList<>();
    mHeights = new ArrayList<>();
    for (int i = 'A'; i <= 'z'; i++) {
      mDatas.add((char) i + "");
    }
    for (int i = 0; i < mDatas.size(); i++) {
      mHeights.add((int) (Math.random() * 300) + 200);
    }
  }

  /**
   * 创建ViewHolder
   */
  @Override public MyRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View mView = mLayoutInflater.inflate(R.layout.item_main, parent, false);
    MyRecyclerViewHolder mViewHolder = new MyRecyclerViewHolder(mView);
    return mViewHolder;
  }

  /**
   * 绑定ViewHoler,给item中的控件设置数据
   */
  @Override public void onBindViewHolder(final MyRecyclerViewHolder holder, final int position) {
    if (mOnItemClickListener != null) {
      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
          mOnItemClickListener.onItemClick(holder.itemView, position);
        }
      });

      holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override public boolean onLongClick(View v) {
          mOnItemClickListener.onItemLongClick(holder.itemView, position);
          return true;
        }
      });
    }

    ViewGroup.LayoutParams mLayoutParams = holder.mTextView.getLayoutParams();
    mLayoutParams.height = mHeights.get(position);
    holder.mTextView.setLayoutParams(mLayoutParams);
    holder.mTextView.setText(mDatas.get(position));
  }

  @Override public int getItemCount() {
    return mDatas.size();
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyViewPagerAdapter.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

/**
 * Created by Monkey on 2015/6/29.
 */
public class MyViewPagerAdapter extends FragmentStatePagerAdapter {

  private String[] mTitles;
  private List<Fragment> mFragments;

  public MyViewPagerAdapter(FragmentManager fm, String[] mTitles, List<Fragment> mFragments) {
    super(fm);
    this.mTitles = mTitles;
    this.mFragments = mFragments;
  }

  @Override public CharSequence getPageTitle(int position) {
    return mTitles[position];
  }

  @Override public Fragment getItem(int position) {
    return mFragments.get(position);
  }

  @Override public int getCount() {
    return mFragments.size();
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/utils/SnackbarUtil.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.utils;

import android.support.design.widget.Snackbar;
import android.view.View;

import com.sunjiajia.androidnewwidgetsdemo.R;

/**
 * Created by Monkey on 2015/7/1.
 */
public class SnackbarUtil {

  // android-support-design兼容包中新添加的一个类似Toast的控件。
  // make()中的第一个参数,可以写当前界面中的任意一个view对象。
  private static Snackbar mSnackbar;

  public static void show(View view, String msg, int flag) {

    if (flag == 0) { // 短时显示
      mSnackbar = Snackbar.make(view, msg, Snackbar.LENGTH_SHORT);
    } else { // 长时显示
      mSnackbar = Snackbar.make(view, msg, Snackbar.LENGTH_LONG);
    }

    mSnackbar.show();
    // Snackbar中有一个可点击的文字,这里设置点击所触发的操作。
    mSnackbar.setAction(R.string.close, new View.OnClickListener() {
      @Override public void onClick(View v) {
        // Snackbar在点击“关闭”后消失
        mSnackbar.dismiss();
      }
    });
  }
}


================================================
FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/view/RoundedImageView.java
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

package com.sunjiajia.androidnewwidgetsdemo.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class RoundedImageView extends ImageView {

  public RoundedImageView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
  }

  public RoundedImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public RoundedImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override protected void onDraw(Canvas canvas) {

    Drawable drawable = getDrawable();

    if (drawable == null) {
      return;
    }

    if (getWidth() == 0 || getHeight() == 0) {
      return;
    }

    Bitmap b = ((BitmapDrawable) drawable).getBitmap();
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

    int w = getWidth();

    Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
    canvas.drawBitmap(roundBitmap, 0, 0, null);
  }

  public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {

    Bitmap sbmp;

    if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
      sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
    } else {
      sbmp = bmp;
    }

    Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());

    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setDither(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(Color.parseColor("#BAB399"));
    canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f, sbmp.getHeight() / 2 + 0.7f,
        sbmp.getWidth() / 2 + 0.1f, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(sbmp, rect, rect, paint);

    return output;
  }
}

================================================
FILE: app/src/main/res/color/selector_nav_menu_textcolor.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:color="@color/main_blue_light" android:state_checked="true"/>
  <item android:color="@color/main_black_grey"/>

</selector>

================================================
FILE: app/src/main/res/layout/activity_my.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

  <!-- 第一个位置 -->
  <!-- 你的主界面内容,必须放置在Drawerlayout中的第一个位置
  根据自己的需要来放置控件,
      例如:LinearLayout布局或者RelativeLayout布局;
  也可以是单个控件,
      如 TextView等  -->
  <include layout="@layout/content_main"/>


  <!-- 第二个位置 -->
  <!-- 用来放Drawerlayout中的内容,
  这里使用NavigationView来实现类似Google pLay中的侧滑栏效果,
  必须在build.gradle中添加compile 'com.android.support:design:22.2.0';
  另外,如果不需要NavigationView效果,
  也可以放置一个普通布局文件就是一个普通的侧滑栏了。
   -->

  <!--
   注意:
      如果使用NavigationView(其他控件也是一样)的特有属性,需要加上命名空间:
              xmlns:app="http://schemas.android.com/apk/res-auto";
      另外,一定要添加android:layout_gravity="left"属性。
   -->

  <!--
      属性解析:
          app:headerLayout:    NavigationView中头部的head部分的布局,是自己实现的;
          app:menu:            指定Nav中的Menu布局,就是自己写Menu中的按钮,要放在res/menu/文件夹下;
          app:itemTextColor:  用来设置Nav中,menu item的颜色选择器。
      还有一些属性:           和itemTextColor用法一样,指定一个颜色选择器,实现不同的颜色效果。
          app:itemIconTint:
          app:itemBackground:
  -->
  <android.support.design.widget.NavigationView
      android:id="@+id/id_navigationview"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:itemTextColor="@color/selector_nav_menu_textcolor"
      android:layout_gravity="left"
      />

</android.support.v4.widget.DrawerLayout>

================================================
FILE: app/src/main/res/layout/content_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<!--
    CoordinatorLayout是这次新添加的一个增强型的FrameLayout,通过它可以实现很多东西:
        例如:
            1.界面向上滚动逐渐隐藏Toolbar;
            2.在其中可以放置浮动的View,就像Floating Action Button。
-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_coordinatorlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >


  <!--
      AppBarLayout跟它的名字一样,把容器类的组件全部作为AppBar。
          将AppBarLayout放在CoordinatorLayout中,就可以实现滚动效果。
          本例中,TabLayout在界面滚动时,随着Toolbar的逐渐隐藏,将占据Toolbar的位置,
              达到节省屏幕空间,界面动画效果的目的。
  -->
  <android.support.design.widget.AppBarLayout
      android:id="@+id/id_appbarlayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      >


    <!--

    属性解析:
        app:theme:指定Toolbar的样式,包括ActionbarToggle和popupMenu的指示图标颜色
        app:popupTheme:指定popupMenu溢出后的样式
        app:title:    指定Toolbar中主Title的内容
    -->

    <!--
        app:layout_scrollFlags的意思是:

            设置的layout_scrollFlags有如下几种选项:
                scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。
                enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
                enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。
                exitUntilCollapsed: 当视图会在滚动时,它一直滚动到设置的minHeight时完全隐藏。

        需要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,
        而前面两种模式基本是需要一起使用的,也就是说,这些flag的使用场景,基本已经固定了。
    -->
    <android.support.v7.widget.Toolbar
        android:id="@+id/id_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:title="@string/toolbar_title"
        />

    <!--
        Tabs选项卡,和ViewPager搭配使用可以增大界面的内容展示量,实现各种个性化分类内容展示而不互相干扰!
        Google在Design support library中提供官方的Tab组件,它就是TabLayout。
        相比Github上面开源的第三方库,这个更加简单易用。

        有以下常用属性:
            app:tabGravity="fill"  表示TabLayout中的Tabs要占满屏幕的width;
            app:tabSelectedTextColor:Tab被选中字体的颜色;
            app:tabTextColor:Tab未被选中字体的颜色;
            app:tabIndicatorColor:Tab指示器下标的颜色;
    -->
    <android.support.design.widget.TabLayout
        android:id="@+id/id_tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabGravity="fill"
        app:tabIndicatorColor="@color/main_white"
        />

  </android.support.design.widget.AppBarLayout>

  <!--
      我们常用的ViewPager,不多说了。你会发现多了一个 app:layout_behavior 属性,没错,
          如果你使用CoordinatorLayout来实现Toolbar滚动渐变消失动画效果,那就必须在它下面的那个控件中加入这个属性,
          并且下面的这个控件必须是可滚动的。
      当设置了layout_behavior的控件滑动时,就会触发设置了layout_scrollFlags的控件发生状态的改变。
  -->
  <android.support.v4.view.ViewPager
      android:id="@+id/id_viewpager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"
      />


  <!--
      这是一个浮动按钮。由于FloatingActionButton是重写ImageView的,
      所有FloatingActionButton拥有ImageView的一切属性。

      属性介绍:
          app:backgroundTint : FAB的背景色。
          app:elevation      :FAB的阴影效果。
          app:rippleColor    :设置涟漪的颜色,默认是由背景色生成的暗色调,可以自己指定。
          app:pressedTranslationZ  :FAB动画效果,在它被按下的时候阴影就会增大。
  -->
  <android.support.design.widget.FloatingActionButton
      android:id="@+id/id_floatingactionbutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="bottom|end"
      android:layout_margin="16dp"
      android:src="@mipmap/ic_action_plusone"
      app:backgroundTint="@color/fab_red"
      app:elevation="6dp"
      app:fabSize="normal"
      app:pressedTranslationZ="12dp"
      app:rippleColor="@color/main_blue_dark"
      />

</android.support.design.widget.CoordinatorLayout>

================================================
FILE: app/src/main/res/layout/content_main_collapsing.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_coordinatorlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    >

  <android.support.design.widget.AppBarLayout
      android:id="@+id/id_appbarlayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      >


    <!--
      设置的layout_scrollFlags有如下几种选项:
        scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。
        enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
        enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。
        exitUntilCollapsed: 滚动退出屏幕,最后折叠在顶端。
    -->

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="?attr/colorPrimary"
        >

      <ImageView
          android:id="@+id/image"
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:scaleType="fitXY"
          android:src="@drawable/ic_user_background"
          app:layout_collapseMode="parallax"
          app:layout_collapseParallaxMultiplier="0.6"
          />

      <!--
                     app:theme:指定Toolbar的样式,包括ActionbarToggle和popupMenu的指示图标颜色
                     app:popupTheme:指定popupMenu溢出后的样式
                     app:title:    指定Toolbar中主Title的内容
                 -->
      <android.support.v7.widget.Toolbar
          android:id="@+id/id_toolbar"
          android:layout_width="match_parent"
          android:layout_height="?attr/actionBarSize"
          android:background="?attr/colorPrimary"
          app:layout_collapseMode="parallax"
          app:layout_scrollFlags="scroll"
          app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
          app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
          app:title="@string/toolbar_title"
          />

    </android.support.design.widget.CollapsingToolbarLayout>

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        >

      <android.support.design.widget.TabLayout
          android:id="@+id/id_tablayout"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          app:tabGravity="fill"
          app:tabIndicatorColor="@color/main_white"
          />

    </android.support.design.widget.CollapsingToolbarLayout>


  </android.support.design.widget.AppBarLayout>

  <android.support.v4.view.ViewPager
      android:id="@+id/id_viewpager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"
      />

  <android.support.design.widget.FloatingActionButton
      android:id="@+id/id_floatingactionbutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="bottom|end"
      android:src="@mipmap/ic_action_plusone"
      app:backgroundTint="@color/main_blue_light"
      app:elevation="6dp"
      app:pressedTranslationZ="12dp"
      app:rippleColor="@color/main_blue_dark"
      />

</android.support.design.widget.CoordinatorLayout>

================================================
FILE: app/src/main/res/layout/frag_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>


<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->


<!--

SwipeRefreshLayout是伟大的Google在v4包中给出的下拉刷新组件。

-->
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_swiperefreshlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    >

  <!--
          使用RecyclerView需要在build.gradle中添加
         compile 'com.android.support:recyclerview-v7:23.3.0'
  -->
  <android.support.v7.widget.RecyclerView
      android:id="@+id/id_recyclerview"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:foregroundGravity="center"
      />


</android.support.v4.widget.SwipeRefreshLayout>


================================================
FILE: app/src/main/res/layout/header_nav.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="220dp"
    android:background="@drawable/ic_user_background"
    android:gravity="center"
    android:orientation="vertical"
    >

  <com.sunjiajia.androidnewwidgetsdemo.view.RoundedImageView
      android:id="@+id/id_header_face"
      android:layout_width="110dp"
      android:layout_height="110dp"
      android:scaleType="fitXY"
      android:src="@drawable/author"
      />

  <TextView
      android:id="@+id/id_header_authorname"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/header_author_name"
      android:textColor="@android:color/black"
      android:textSize="16sp"
      />

  <TextView
      android:id="@+id/id_header_url"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/header_author_url"
      android:textColor="@android:color/black"
      android:textSize="18sp"
      />


</LinearLayout>

================================================
FILE: app/src/main/res/layout/item_main.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<!--
    CardView就是一个卡片样式的FrameLayout。

    参数介绍:
        app:cardBackgroundColor  :   背景颜色
        app:cardCornerRadius    :   设置圆角。
        app:cardElevation       :    阴影。
        app:cardMaxElevation    :       最大阴影。
        app:cardPreventCornerOverlap  : 在v20和之前的版本中添加内边距,
                                    这个属性是为了防止卡片内容和边角的重叠。

       app:cardUseCompatPadding  :  设置内边距,v21+的版本和之前的版本仍旧具有一样的计算方式
-->
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_cardview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    app:cardBackgroundColor="@color/main_blue_light"
    app:cardCornerRadius="4dp"
    app:cardElevation="5dp"
    app:cardMaxElevation="6dp"
    app:cardPreventCornerOverlap="true"
    app:cardUseCompatPadding="true"
    >

  <TextView
      android:id="@+id/id_textview"
      android:layout_width="match_parent"
      android:layout_height="200dp"
      android:gravity="center"
      android:text="ABCD"
      android:textColor="@color/main_white"
      android:textSize="30sp"
      />

</android.support.v7.widget.CardView>

================================================
FILE: app/src/main/res/menu/menu_my.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MyActivity">
  <item
      android:id="@+id/action_settings"
      android:title="@string/action_settings"
      android:orderInCategory="100"
      app:showAsAction="never"/>
</menu>


================================================
FILE: app/src/main/res/menu/menu_nav.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<menu xmlns:android="http://schemas.android.com/apk/res/android">


  <group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_menu_home"
        android:icon="@mipmap/ic_home_white_48dp"
        android:title="主页"/>

    <item
        android:id="@+id/nav_menu_categories"
        android:icon="@mipmap/ic_sort_by_alpha_white_48dp"
        android:title="分类"/>

    <item
        android:id="@+id/nav_menu_feedback"
        android:icon="@mipmap/ic_message_white_48dp"
        android:title="反馈"/>
    <item
        android:id="@+id/nav_menu_setting"
        android:icon="@mipmap/ic_settings_white_48dp"
        android:title="设置"/>

  </group>
</menu>

================================================
FILE: app/src/main/res/values/arrays.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<resources>

  <string-array name="tab_titles">
    <item>垂直List</item>
    <item>水平List</item>
    <item>垂直Grid</item>
    <item>水平Grid</item>
    <item>瀑布Staggered</item>
  </string-array>
</resources>

================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<resources>

  <color name="main_blue_light">#3F56B5</color>
  <color name="main_blue_dark">#30459E</color>
  <color name="main_white">#FFFFFF</color>
  <color name="main_black">#000000</color>
  <color name="main_black_grey">#6D6D6D</color>
  <color name="fab_red">#ff0000</color>


</resources>

================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<resources>
  <!-- Default screen margins, per the Android Design guidelines. -->
  <dimen name="activity_horizontal_margin">16dp</dimen>
  <dimen name="activity_vertical_margin">16dp</dimen>
</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<resources>
  <string name="app_name">Android New Widgets Demo</string>

  <string name="toolbar_title">New Demo</string>
  <string name="action_settings">settings</string>
  <string name="open">打开</string>
  <string name="close">关闭</string>
  <string name="header_author_name">安卓猴</string>
  <string name="header_author_url">sunjiajia.com</string>
  <string name="plusone">+1</string>
  <string name="item_clicked">item clicked!</string>
  <string name="item_longclicked">item long clicked!</string>

</resources>


================================================
FILE: app/src/main/res/values/styles.xml
================================================
<!--
  ~ /*
  ~  *
  ~  *  *
  ~  *  *  * ===================================
  ~  *  *  * Copyright (c) 2016.
  ~  *  *  * 作者:安卓猴
  ~  *  *  * 微博:@安卓猴
  ~  *  *  * 博客:http://sunjiajia.com
  ~  *  *  * Github:https://github.com/opengit
  ~  *  *  *
  ~  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
  ~  *  *  * ===================================
  ~  *  *
  ~  *  *
  ~  *
  ~  */
  -->

<resources>

  <style name="AppTheme" parent="MyThemeBlue"></style>

  <!-- 蓝色为主色调 -->
  <style name="MyThemeBlue" parent="Theme.AppCompat.Light.NoActionBar">

    <!--选中状态icon的颜色和字体颜色-->
    <item name="colorPrimary">@color/main_blue_light</item>
    <item name="colorPrimaryDark">@color/main_blue_dark</item>
    <item name="colorAccent">@color/main_blue_light</item>
    <!--正常状态下字体颜色和icon颜色-->
    <item name="android:textColorPrimary">@color/main_white</item>

  </style>
</resources>


================================================
FILE: build.gradle
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#
# /*
#  *
#  *  *
#  *  *  * ===================================
#  *  *  * Copyright (c) 2016.
#  *  *  * 作者:安卓猴
#  *  *  * 微博:@安卓猴
#  *  *  * 博客:http://sunjiajia.com
#  *  *  * Github:https://github.com/opengit
#  *  *  *
#  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
#  *  *  * ===================================
#  *  *
#  *  *
#  *
#  */
#

#Fri Apr 29 16:20:43 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip


================================================
FILE: gradle.properties
================================================
#
# /*
#  *
#  *  *
#  *  *  * ===================================
#  *  *  * Copyright (c) 2016.
#  *  *  * 作者:安卓猴
#  *  *  * 微博:@安卓猴
#  *  *  * 博客:http://sunjiajia.com
#  *  *  * Github:https://github.com/opengit
#  *  *  *
#  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
#  *  *  * ===================================
#  *  *
#  *  *
#  *
#  */
#

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

================================================
FILE: gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: settings.gradle
================================================
/*
 *
 *  *
 *  *  *
 *  *  *  * ===================================
 *  *  *  * Copyright (c) 2016.
 *  *  *  * 作者:安卓猴
 *  *  *  * 微博:@安卓猴
 *  *  *  * 博客:http://sunjiajia.com
 *  *  *  * Github:https://github.com/opengit
 *  *  *  *
 *  *  *  * 注意**:如果您使用或者修改该代码,请务必保留此版权信息。
 *  *  *  * ===================================
 *  *  *
 *  *  *
 *  *
 *
 */

include ':app'
Download .txt
gitextract_zt7kdd55/

├── .gitignore
├── .idea/
│   ├── .name
│   ├── compiler.xml
│   ├── copyright/
│   │   ├── monkey.xml
│   │   └── profiles_settings.xml
│   ├── encodings.xml
│   ├── gradle.xml
│   ├── misc.xml
│   ├── modules.xml
│   ├── runConfigurations.xml
│   └── vcs.xml
├── AndroidNewWidgetsDemo.iml
├── README.md
├── app/
│   ├── .gitignore
│   ├── app.iml
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── sunjiajia/
│       │               └── androidnewwidgetsdemo/
│       │                   └── ApplicationTest.java
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── sunjiajia/
│           │           └── androidnewwidgetsdemo/
│           │               ├── MyActivity.java
│           │               ├── MyFragment.java
│           │               ├── adapter/
│           │               │   ├── MyRecyclerViewAdapter.java
│           │               │   ├── MyRecyclerViewHolder.java
│           │               │   ├── MyStaggeredViewAdapter.java
│           │               │   └── MyViewPagerAdapter.java
│           │               ├── utils/
│           │               │   └── SnackbarUtil.java
│           │               └── view/
│           │                   └── RoundedImageView.java
│           └── res/
│               ├── color/
│               │   └── selector_nav_menu_textcolor.xml
│               ├── layout/
│               │   ├── activity_my.xml
│               │   ├── content_main.xml
│               │   ├── content_main_collapsing.xml
│               │   ├── frag_main.xml
│               │   ├── header_nav.xml
│               │   └── item_main.xml
│               ├── menu/
│               │   ├── menu_my.xml
│               │   └── menu_nav.xml
│               └── values/
│                   ├── arrays.xml
│                   ├── colors.xml
│                   ├── dimens.xml
│                   ├── strings.xml
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Download .txt
SYMBOL INDEX (54 symbols across 9 files)

FILE: app/src/androidTest/java/com/sunjiajia/androidnewwidgetsdemo/ApplicationTest.java
  class ApplicationTest (line 9) | public class ApplicationTest extends ApplicationTestCase<Application> {
    method ApplicationTest (line 10) | public ApplicationTest() {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyActivity.java
  class MyActivity (line 49) | public class MyActivity extends AppCompatActivity
    method onCreate (line 69) | @Override protected void onCreate(Bundle savedInstanceState) {
    method initData (line 84) | private void initData() {
    method configViews (line 100) | private void configViews() {
    method onNavgationViewMenuItemSelected (line 142) | private void onNavgationViewMenuItemSelected(NavigationView mNav) {
    method initViews (line 175) | private void initViews() {
    method onCreateOptionsMenu (line 186) | @Override public boolean onCreateOptionsMenu(Menu menu) {
    method onOptionsItemSelected (line 191) | @Override public boolean onOptionsItemSelected(MenuItem item) {
    method onPageSelected (line 201) | @Override public void onPageSelected(int position) {
    method onPageScrolled (line 205) | @Override
    method onPageScrollStateChanged (line 210) | @Override public void onPageScrollStateChanged(int state) {
    method onClick (line 214) | @Override public void onClick(View v) {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyFragment.java
  class MyFragment (line 42) | public class MyFragment extends Fragment
    method onCreateView (line 62) | @Nullable @Override public View onCreateView(LayoutInflater inflater, ...
    method onActivityCreated (line 68) | @Override public void onActivityCreated(@Nullable Bundle savedInstance...
    method configRecyclerView (line 82) | private void configRecyclerView() {
    method onRefresh (line 120) | @Override public void onRefresh() {
    method onItemClick (line 139) | @Override public void onItemClick(View view, int position) {
    method onItemLongClick (line 143) | @Override public void onItemLongClick(View view, int position) {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewAdapter.java
  class MyRecyclerViewAdapter (line 36) | public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecycl...
    type OnItemClickListener (line 38) | public interface OnItemClickListener {
      method onItemClick (line 39) | void onItemClick(View view, int position);
      method onItemLongClick (line 41) | void onItemLongClick(View view, int position);
    method setOnItemClickListener (line 46) | public void setOnItemClickListener(OnItemClickListener listener) {
    method MyRecyclerViewAdapter (line 54) | public MyRecyclerViewAdapter(Context mContext) {
    method onCreateViewHolder (line 66) | @Override public MyRecyclerViewHolder onCreateViewHolder(ViewGroup par...
    method onBindViewHolder (line 75) | @Override public void onBindViewHolder(final MyRecyclerViewHolder hold...
    method getItemCount (line 94) | @Override public int getItemCount() {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewHolder.java
  class MyRecyclerViewHolder (line 31) | public class MyRecyclerViewHolder extends RecyclerView.ViewHolder {
    method MyRecyclerViewHolder (line 35) | public MyRecyclerViewHolder(View itemView) {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyStaggeredViewAdapter.java
  class MyStaggeredViewAdapter (line 36) | public class MyStaggeredViewAdapter extends RecyclerView.Adapter<MyRecyc...
    type OnItemClickListener (line 38) | public interface OnItemClickListener {
      method onItemClick (line 39) | void onItemClick(View view, int position);
      method onItemLongClick (line 41) | void onItemLongClick(View view, int position);
    method setOnItemClickListener (line 46) | public void setOnItemClickListener(OnItemClickListener listener) {
    method MyStaggeredViewAdapter (line 55) | public MyStaggeredViewAdapter(Context mContext) {
    method onCreateViewHolder (line 71) | @Override public MyRecyclerViewHolder onCreateViewHolder(ViewGroup par...
    method onBindViewHolder (line 80) | @Override public void onBindViewHolder(final MyRecyclerViewHolder hold...
    method getItemCount (line 102) | @Override public int getItemCount() {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyViewPagerAdapter.java
  class MyViewPagerAdapter (line 31) | public class MyViewPagerAdapter extends FragmentStatePagerAdapter {
    method MyViewPagerAdapter (line 36) | public MyViewPagerAdapter(FragmentManager fm, String[] mTitles, List<F...
    method getPageTitle (line 42) | @Override public CharSequence getPageTitle(int position) {
    method getItem (line 46) | @Override public Fragment getItem(int position) {
    method getCount (line 50) | @Override public int getCount() {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/utils/SnackbarUtil.java
  class SnackbarUtil (line 30) | public class SnackbarUtil {
    method show (line 36) | public static void show(View view, String msg, int flag) {

FILE: app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/view/RoundedImageView.java
  class RoundedImageView (line 35) | public class RoundedImageView extends ImageView {
    method RoundedImageView (line 37) | public RoundedImageView(Context context) {
    method RoundedImageView (line 42) | public RoundedImageView(Context context, AttributeSet attrs) {
    method RoundedImageView (line 46) | public RoundedImageView(Context context, AttributeSet attrs, int defSt...
    method onDraw (line 50) | @Override protected void onDraw(Canvas canvas) {
    method getCroppedBitmap (line 71) | public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Condensed preview — 48 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (91K chars).
[
  {
    "path": ".gitignore",
    "chars": 91,
    "preview": ".gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": ".idea/.name",
    "chars": 21,
    "preview": "AndroidNewWidgetsDemo"
  },
  {
    "path": ".idea/compiler.xml",
    "chars": 686,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExt"
  },
  {
    "path": ".idea/copyright/monkey.xml",
    "chars": 525,
    "preview": "<component name=\"CopyrightManager\">\n  <copyright>\n    <option name=\"myName\" value=\"monkey\" />\n    <option name=\"notice\" "
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "chars": 189,
    "preview": "<component name=\"CopyrightManager\">\n  <settings default=\"monkey\">\n    <module2copyright>\n      <element module=\"All\" cop"
  },
  {
    "path": ".idea/encodings.xml",
    "chars": 200,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" defaultCharsetForPropertiesFil"
  },
  {
    "path": ".idea/gradle.xml",
    "chars": 816,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linke"
  },
  {
    "path": ".idea/misc.xml",
    "chars": 2645,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points v"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 379,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/runConfigurations.xml",
    "chars": 564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <o"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "AndroidNewWidgetsDemo.iml",
    "chars": 952,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"AndroidNewWidgetsDemo\" external.linked.projec"
  },
  {
    "path": "README.md",
    "chars": 1162,
    "preview": "# 一个Demo学会用Android兼容包新控件\n\n伟大的Google为Android推出了一系列的兼容包,最新的就是Design Support Library了,这里我们结合v7和v4中的几个控件,来主要学习Design Support"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/app.iml",
    "chars": 10422,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\":app\" external.linked.project.path=\"$MODULE_D"
  },
  {
    "path": "app/build.gradle",
    "chars": 1053,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 665,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in D:"
  },
  {
    "path": "app/src/androidTest/java/com/sunjiajia/androidnewwidgetsdemo/ApplicationTest.java",
    "chars": 366,
    "preview": "package com.sunjiajia.androidnewwidgetsdemo;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 1021,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyActivity.java",
    "chars": 6941,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/MyFragment.java",
    "chars": 4955,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewAdapter.java",
    "chars": 2554,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyRecyclerViewHolder.java",
    "chars": 847,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyStaggeredViewAdapter.java",
    "chars": 2913,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/adapter/MyViewPagerAdapter.java",
    "chars": 1196,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/utils/SnackbarUtil.java",
    "chars": 1237,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/java/com/sunjiajia/androidnewwidgetsdemo/view/RoundedImageView.java",
    "chars": 2623,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "app/src/main/res/color/selector_nav_menu_textcolor.xml",
    "chars": 632,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/layout/activity_my.xml",
    "chars": 1935,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "app/src/main/res/layout/content_main.xml",
    "chars": 4528,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~ "
  },
  {
    "path": "app/src/main/res/layout/content_main_collapsing.xml",
    "chars": 4159,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/layout/frag_main.xml",
    "chars": 1223,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n "
  },
  {
    "path": "app/src/main/res/layout/header_nav.xml",
    "chars": 1506,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/layout/item_main.xml",
    "chars": 1634,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "app/src/main/res/menu/menu_my.xml",
    "chars": 759,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "app/src/main/res/menu/menu_nav.xml",
    "chars": 1102,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/values/arrays.xml",
    "chars": 625,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 718,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 588,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 898,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 873,
    "preview": "<!--\n  ~ /*\n  ~  *\n  ~  *  *\n  ~  *  *  * ===================================\n  ~  *  *  * Copyright (c) 2016.\n  ~  *  *"
  },
  {
    "path": "build.gradle",
    "chars": 792,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 575,
    "preview": "#\n# /*\n#  *\n#  *  *\n#  *  *  * ===================================\n#  *  *  * Copyright (c) 2016.\n#  *  *  * 作者:安卓猴\n#  *"
  },
  {
    "path": "gradle.properties",
    "chars": 1199,
    "preview": "#\n# /*\n#  *\n#  *  *\n#  *  *  * ===================================\n#  *  *  * Copyright (c) 2016.\n#  *  *  * 作者:安卓猴\n#  *"
  },
  {
    "path": "gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "settings.gradle",
    "chars": 371,
    "preview": "/*\n *\n *  *\n *  *  *\n *  *  *  * ===================================\n *  *  *  * Copyright (c) 2016.\n *  *  *  * 作者:安卓猴\n"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the opengit/AndroidNewWidgetsDemo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 48 files (74.9 KB), approximately 23.8k tokens, and a symbol index with 54 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!