├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── LICENSE ├── README.md ├── README_CN.md ├── build.gradle ├── demo ├── .gitignore ├── build.gradle ├── fragmentation.jks.enc ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── yokeyword │ │ └── fragmentation │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── yokeyword │ │ │ └── sample │ │ │ ├── App.java │ │ │ ├── EnterActivity.java │ │ │ ├── demo_flow │ │ │ ├── MainActivity.java │ │ │ ├── SwipeBackSampleActivity.java │ │ │ ├── adapter │ │ │ │ ├── DiscoverFragmentAdapter.java │ │ │ │ ├── HomeAdapter.java │ │ │ │ ├── MenuAdapter.java │ │ │ │ └── PagerAdapter.java │ │ │ ├── base │ │ │ │ ├── BaseBackFragment.java │ │ │ │ ├── BaseMainFragment.java │ │ │ │ ├── MySupportActivity.java │ │ │ │ └── MySupportFragment.java │ │ │ ├── entity │ │ │ │ └── Article.java │ │ │ ├── listener │ │ │ │ └── OnItemClickListener.java │ │ │ └── ui │ │ │ │ ├── fragment │ │ │ │ ├── CycleFragment.java │ │ │ │ ├── account │ │ │ │ │ ├── LoginFragment.java │ │ │ │ │ └── RegisterFragment.java │ │ │ │ ├── discover │ │ │ │ │ ├── DiscoverFragment.java │ │ │ │ │ └── PagerChildFragment.java │ │ │ │ ├── home │ │ │ │ │ ├── DetailFragment.java │ │ │ │ │ ├── HomeFragment.java │ │ │ │ │ └── ModifyDetailFragment.java │ │ │ │ └── shop │ │ │ │ │ ├── ContentFragment.java │ │ │ │ │ ├── MenuListFragment.java │ │ │ │ │ └── ShopFragment.java │ │ │ │ └── fragment_swipe_back │ │ │ │ ├── BaseSwipeBackFragment.java │ │ │ │ ├── FirstSwipeBackFragment.java │ │ │ │ └── RecyclerSwipeBackFragment.java │ │ │ ├── demo_wechat │ │ │ ├── MainActivity.java │ │ │ ├── adapter │ │ │ │ ├── ChatAdapter.java │ │ │ │ ├── HomeAdapter.java │ │ │ │ ├── MsgAdapter.java │ │ │ │ ├── PagerAdapter.java │ │ │ │ └── WechatPagerFragmentAdapter.java │ │ │ ├── base │ │ │ │ ├── BaseBackFragment.java │ │ │ │ └── BaseMainFragment.java │ │ │ ├── entity │ │ │ │ ├── Article.java │ │ │ │ ├── Chat.java │ │ │ │ └── Msg.java │ │ │ ├── event │ │ │ │ ├── StartBrotherEvent.java │ │ │ │ └── TabSelectedEvent.java │ │ │ ├── listener │ │ │ │ └── OnItemClickListener.java │ │ │ └── ui │ │ │ │ ├── fragment │ │ │ │ ├── CycleFragment.java │ │ │ │ ├── MainFragment.java │ │ │ │ ├── first │ │ │ │ │ ├── MsgFragment.java │ │ │ │ │ └── WechatFirstTabFragment.java │ │ │ │ ├── second │ │ │ │ │ ├── DemoDialogFragment.java │ │ │ │ │ ├── FirstPagerFragment.java │ │ │ │ │ ├── NewFeatureFragment.java │ │ │ │ │ ├── OtherPagerFragment.java │ │ │ │ │ ├── ViewFragment.java │ │ │ │ │ └── WechatSecondTabFragment.java │ │ │ │ └── third │ │ │ │ │ ├── DetailFragment.java │ │ │ │ │ ├── ModifyDetailFragment.java │ │ │ │ │ └── WechatThirdTabFragment.java │ │ │ │ └── view │ │ │ │ ├── BottomBar.java │ │ │ │ └── BottomBarTab.java │ │ │ └── demo_zhihu │ │ │ ├── MainActivity.java │ │ │ ├── adapter │ │ │ ├── FirstHomeAdapter.java │ │ │ ├── HomeAdapter.java │ │ │ ├── MenuAdapter.java │ │ │ └── ZhihuPagerFragmentAdapter.java │ │ │ ├── base │ │ │ ├── BaseBackFragment.java │ │ │ └── BaseMainFragment.java │ │ │ ├── entity │ │ │ └── Article.java │ │ │ ├── event │ │ │ └── TabSelectedEvent.java │ │ │ ├── helper │ │ │ └── DetailTransition.java │ │ │ ├── listener │ │ │ └── OnItemClickListener.java │ │ │ └── ui │ │ │ ├── fragment │ │ │ ├── CycleFragment.java │ │ │ ├── first │ │ │ │ ├── ZhihuFirstFragment.java │ │ │ │ └── child │ │ │ │ │ ├── FirstDetailFragment.java │ │ │ │ │ └── FirstHomeFragment.java │ │ │ ├── fourth │ │ │ │ ├── ZhihuFourthFragment.java │ │ │ │ └── child │ │ │ │ │ ├── AvatarFragment.java │ │ │ │ │ ├── MeFragment.java │ │ │ │ │ └── SettingsFragment.java │ │ │ ├── second │ │ │ │ ├── ZhihuSecondFragment.java │ │ │ │ └── child │ │ │ │ │ ├── DetailFragment.java │ │ │ │ │ ├── ModifyDetailFragment.java │ │ │ │ │ ├── ViewPagerFragment.java │ │ │ │ │ └── childpager │ │ │ │ │ ├── FirstPagerFragment.java │ │ │ │ │ └── OtherPagerFragment.java │ │ │ └── third │ │ │ │ ├── ZhihuThirdFragment.java │ │ │ │ └── child │ │ │ │ ├── ShopFragment.java │ │ │ │ └── child │ │ │ │ ├── ContentFragment.java │ │ │ │ └── MenuListFragment.java │ │ │ └── view │ │ │ ├── BottomBar.java │ │ │ └── BottomBarTab.java │ └── res │ │ ├── drawable-hdpi │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ ├── bg_chat_right.9.png │ │ ├── ic_account_circle_white_24dp.png │ │ ├── ic_account_circle_white_48dp.png │ │ ├── ic_arrow_back_white_24dp.png │ │ ├── ic_arrow_forward_white_24dp.png │ │ ├── ic_discover_white_24dp.png │ │ ├── ic_home_white_24dp.png │ │ ├── ic_launcher.png │ │ ├── ic_menu_white_24dp.png │ │ ├── ic_message_white_24dp.png │ │ ├── ic_settings_grey_500_24dp.png │ │ ├── ic_touch_app_white_24dp.png │ │ └── logo.png │ │ ├── drawable-xxhdpi │ │ ├── actionbar_shadow_up.9.png │ │ ├── bg_fifth.png │ │ ├── bg_first.png │ │ ├── bg_fourth.png │ │ ├── bg_second.png │ │ ├── bg_third.png │ │ ├── ic_account_circle_white_24dp.png │ │ ├── ic_account_circle_white_48dp.png │ │ ├── ic_arrow_back_white_24dp.png │ │ ├── ic_arrow_forward_white_24dp.png │ │ ├── ic_avatar.png │ │ ├── ic_discover_white_24dp.png │ │ ├── ic_home_white_24dp.png │ │ ├── ic_launcher.png │ │ ├── ic_menu_white_24dp.png │ │ ├── ic_message_white_24dp.png │ │ ├── ic_settings_grey_500_24dp.png │ │ └── ic_touch_app_white_24dp.png │ │ ├── drawable-xxxhdpi │ │ └── ic_launcher.png │ │ ├── drawable │ │ ├── bg_msg_bubble.xml │ │ └── side_nav_bar.xml │ │ ├── layout │ │ ├── activity_enter.xml │ │ ├── activity_main.xml │ │ ├── activity_swipe_back.xml │ │ ├── content_detail.xml │ │ ├── fragment_content.xml │ │ ├── fragment_cycle.xml │ │ ├── fragment_detail.xml │ │ ├── fragment_discover.xml │ │ ├── fragment_home.xml │ │ ├── fragment_list_menu.xml │ │ ├── fragment_login.xml │ │ ├── fragment_modify_detail.xml │ │ ├── fragment_pager.xml │ │ ├── fragment_register.xml │ │ ├── fragment_shop.xml │ │ ├── fragment_swipe_back_first.xml │ │ ├── fragment_swipe_back_recy.xml │ │ ├── item_home.xml │ │ ├── item_menu.xml │ │ ├── item_pager.xml │ │ ├── item_wechat_chat.xml │ │ ├── item_wechat_msg.xml │ │ ├── item_zhihu_home_first.xml │ │ ├── nav_header_main.xml │ │ ├── toolbar.xml │ │ ├── wechat_activity_main.xml │ │ ├── wechat_fragment_dialog.xml │ │ ├── wechat_fragment_main.xml │ │ ├── wechat_fragment_new_feature.xml │ │ ├── wechat_fragment_tab_first.xml │ │ ├── wechat_fragment_tab_first_msg.xml │ │ ├── wechat_fragment_tab_second.xml │ │ ├── wechat_fragment_tab_second_pager_first.xml │ │ ├── wechat_fragment_tab_second_pager_other.xml │ │ ├── wechat_fragment_tab_third.xml │ │ ├── wechat_fragment_view.xml │ │ ├── zhihu_activity_main.xml │ │ ├── zhihu_fragment_first.xml │ │ ├── zhihu_fragment_first_detail.xml │ │ ├── zhihu_fragment_first_home.xml │ │ ├── zhihu_fragment_fourth.xml │ │ ├── zhihu_fragment_fourth_avatar.xml │ │ ├── zhihu_fragment_fourth_me.xml │ │ ├── zhihu_fragment_fourth_settings.xml │ │ ├── zhihu_fragment_second.xml │ │ ├── zhihu_fragment_second_pager.xml │ │ ├── zhihu_fragment_second_pager_first.xml │ │ ├── zhihu_fragment_second_pager_other.xml │ │ └── zhihu_fragment_third.xml │ │ ├── menu │ │ ├── activity_main_drawer.xml │ │ ├── home.xml │ │ └── home_pop.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── me │ └── yokeyword │ └── fragmentation │ └── ExampleUnitTest.java ├── eventbus_activity_scope ├── .gitignore ├── README.md ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── me │ └── yokeyword │ └── eventbusactivityscope │ ├── EventBusActivityScope.java │ └── RuntimeTrojanProvider.java ├── fragmentation ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── me │ └── yokeyword │ └── fragmentation │ ├── SupportActivity.java │ └── SupportFragment.java ├── fragmentation_core ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── androidx │ │ └── fragment │ │ │ └── app │ │ │ └── FragmentationMagician.java │ └── me │ │ └── yokeyword │ │ └── fragmentation │ │ ├── ExtraTransaction.java │ │ ├── Fragmentation.java │ │ ├── ISupportActivity.java │ │ ├── ISupportFragment.java │ │ ├── SupportActivityDelegate.java │ │ ├── SupportFragmentDelegate.java │ │ ├── SupportHelper.java │ │ ├── TransactionDelegate.java │ │ ├── anim │ │ ├── DefaultHorizontalAnimator.java │ │ ├── DefaultNoAnimator.java │ │ ├── DefaultVerticalAnimator.java │ │ └── FragmentAnimator.java │ │ ├── debug │ │ ├── DebugFragmentRecord.java │ │ ├── DebugHierarchyViewContainer.java │ │ └── DebugStackDelegate.java │ │ ├── exception │ │ └── AfterSaveStateTransactionWarning.java │ │ ├── helper │ │ ├── ExceptionHandler.java │ │ └── internal │ │ │ ├── AnimatorHelper.java │ │ │ ├── ResultRecord.java │ │ │ ├── TransactionRecord.java │ │ │ └── VisibleDelegate.java │ │ └── queue │ │ ├── Action.java │ │ └── ActionQueue.java │ └── res │ ├── anim │ ├── h_fragment_enter.xml │ ├── h_fragment_exit.xml │ ├── h_fragment_pop_enter.xml │ ├── h_fragment_pop_exit.xml │ ├── no_anim.xml │ ├── pop_exit_no_anim.xml │ ├── v_fragment_enter.xml │ ├── v_fragment_exit.xml │ ├── v_fragment_pop_enter.xml │ └── v_fragment_pop_exit.xml │ ├── drawable-xxhdpi │ ├── fragmentation_help.png │ ├── fragmentation_ic_expandable.png │ ├── fragmentation_ic_right.png │ └── fragmentation_ic_stack.png │ ├── values-zh │ └── strings.xml │ └── values │ ├── ids.xml │ └── strings.xml ├── fragmentation_swipeback ├── .gitignore ├── README.md ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── me │ │ └── yokeyword │ │ ├── fragmentation │ │ └── SwipeBackLayout.java │ │ └── fragmentation_swipeback │ │ ├── SwipeBackActivity.java │ │ ├── SwipeBackFragment.java │ │ └── core │ │ ├── ISwipeBackActivity.java │ │ ├── ISwipeBackFragment.java │ │ ├── SwipeBackActivityDelegate.java │ │ └── SwipeBackFragmentDelegate.java │ └── res │ └── drawable-xhdpi │ ├── shadow_bottom.png │ ├── shadow_left.png │ └── shadow_right.png ├── gif ├── SwipeBack.png ├── demo1.gif ├── demo2.gif ├── demo3.gif ├── log.png ├── logo.png ├── stack.png └── swipe.gif ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .idea/ 7 | .DS_Store 8 | /build 9 | /captures 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | jdk: oraclejdk8 3 | sudo: false 4 | 5 | android: 6 | components: 7 | - tools 8 | - platform-tools 9 | - build-tools-27.0.2 10 | - android-27 11 | - extra-android-m2repository 12 | - extra-android-support 13 | 14 | before_install: 15 | - yes | sdkmanager "platforms;android-27" 16 | - openssl aes-256-cbc -K $encrypted_e460bf741e28_key -iv $encrypted_e460bf741e28_iv 17 | -in demo/fragmentation.jks.enc -out demo/fragmentation.jks -d 18 | 19 | script: 20 | - ./gradlew assembleRelease 21 | 22 | deploy: 23 | provider: releases 24 | api_key: 25 | secure: geywOZpk89iwemfT5YdxhkpO0q80Jd2eL3caLvs6spwDXknwZQay6T0qdsQ+R488tPgYpael4udoC0D/dQ93n3Rh0ssw6xCzznfQbrqb00PURcEH8grRQKwDoQAifrwpBEy3RzrF5M/4t4Pd+NAdlinsbDXjiTYxahJgltv0wpwFtMR3G0t7RMduU7m+tup2DAe3YF02VXrsSu8TBxf1cqnQ6vMp+TfD9FHGF0IUh/O0eTDw4twI9n0tQMxoJeb0oY5Eq/k+eL/zmDGjLbUHojmBkx1539y7RP4d+e4Y41cblwZWpFkh0IKSJmiRfJ1lSO9dcUnagFem5Z1SZqc1SgsIbJGJZdliAtxQgbgdmQvY9DsD5aNh60GGbk0cX5E3evCRz9fQlaxiNq4b68ZfysJmPHp6fsX6WR/cYVop3Sh1tYeNKPw4MhMfrN9ozTpxxe1oqB/oaw6bhZ7dwn0T1Ol6mjHnhyQXzmTkIqikhOe3ySk6vTm+F2iS+RL0nBLTp4h5hQe+jdvnlsc+z2nWLpcgPIVFdtse5+RC+OhcmCLyKCV9IGQUoFhT8suswGTzN8EO0RYV/tRi6ES0ZcBoGs5+upDI9kN2oBSNbYBWAHl2u4YGKuozXtJjseNPdva+qKHG1p7fPzTYTFVtP1HDGc0pjZ/ih8YnnX6baytgOpA= 26 | file: demo/build/outputs/apk/release/fragmentation.apk 27 | skip_cleanup: true 28 | on: 29 | tags: true 30 | 31 | after_deploy: 32 | - curl -F "file=@demo/build/outputs/apk/release/fragmentation.apk" -F "uKey=$UKEY" -F "_api_key=$API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.0.0-rc 4 | Support Androidx! 5 | 6 | ## Pre 7 | [master](https://github.com/YoKeyword/Fragmentation/blob/master/CHANGELOG.md) 8 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guideline 2 | 3 | Thanks for considering to contribute this project. All issues and pull requests are highly appreciated. 4 | 5 | ## Pull Requests 6 | 7 | Before sending pull request to this project, please read and follow guidelines below. 8 | 9 | * Coding style: Follow the coding style used in Fragmentation. 10 | * Test: Make sure to test your code. 11 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Issues Guideline 2 | 3 | Following information can help us to resolve the issue faster. 4 | 5 | * Library version 6 | * Support-v4 version 7 | * Logs 8 | * Screenshots 9 | 10 | **In addition, we do not accept issues unrelated to Fragmentation.** -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | google() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.2.1' 10 | // classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | 25 | ext { 26 | compileSdkVersion = 28 27 | minSdkVersion = 14 28 | targetSdkVersion = compileSdkVersion 29 | 30 | appCompatVersion = "1.1.0-alpha01" 31 | } 32 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | static def gitLatestTag() { 4 | try { 5 | def cmd = 'git describe --abbrev=0 --tags' 6 | def result = cmd.execute().text.trim() 7 | return result 8 | } catch (Exception e) { 9 | return '1.0.0' 10 | } 11 | } 12 | 13 | android { 14 | compileSdkVersion rootProject.compileSdkVersion 15 | 16 | defaultConfig { 17 | applicationId "me.yokeyword.sample" 18 | minSdkVersion rootProject.minSdkVersion 19 | targetSdkVersion rootProject.targetSdkVersion 20 | versionCode 1 21 | versionName gitLatestTag() 22 | } 23 | 24 | signingConfigs { 25 | releaseConfig { 26 | storeFile file("./fragmentation.jks") 27 | storePassword System.getenv("KEYSTORE_PASS") 28 | keyAlias System.getenv("ALIAS_NAME") 29 | keyPassword System.getenv("ALIAS_PASS") 30 | } 31 | } 32 | 33 | buildTypes { 34 | release { 35 | minifyEnabled false 36 | 37 | signingConfig signingConfigs.releaseConfig 38 | 39 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 40 | } 41 | } 42 | 43 | 44 | android.applicationVariants.all { variant -> 45 | variant.outputs.all { 46 | if (variant.buildType.name == 'release') { 47 | outputFileName = "fragmentation.apk" 48 | } 49 | } 50 | } 51 | } 52 | 53 | dependencies { 54 | implementation fileTree(include: ['*.jar'], dir: 'libs') 55 | testImplementation 'junit:junit:4.12' 56 | api "androidx.appcompat:appcompat:$rootProject.appCompatVersion" 57 | implementation 'com.google.android.material:material:1.1.0-alpha02' 58 | implementation 'androidx.cardview:cardview:1.0.0' 59 | implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01' 60 | api project(':fragmentation') 61 | api project(':fragmentation_swipeback') 62 | // EventBus 63 | api project(':eventbus_activity_scope') 64 | implementation 'org.greenrobot:eventbus:3.0.0' 65 | // apt 'org.greenrobot:eventbus-annotation-processor:3.0.1' 66 | } 67 | 68 | -------------------------------------------------------------------------------- /demo/fragmentation.jks.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/fragmentation.jks.enc -------------------------------------------------------------------------------- /demo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -printmapping mapping.txt 2 | 3 | #EventBus 4 | -keepattributes *Annotation* 5 | -keepclassmembers class ** { 6 | @org.greenrobot.eventbus.Subscribe ; 7 | } 8 | -keep enum org.greenrobot.eventbus.ThreadMode { *; } -------------------------------------------------------------------------------- /demo/src/androidTest/java/me/yokeyword/fragmentation/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.fragmentation; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 29 | 30 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/App.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample; 2 | 3 | import android.app.Application; 4 | 5 | import me.yokeyword.fragmentation.Fragmentation; 6 | import me.yokeyword.fragmentation.helper.ExceptionHandler; 7 | 8 | /** 9 | * Created by YoKey on 16/11/23. 10 | */ 11 | public class App extends Application { 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | 17 | Fragmentation.builder() 18 | // 设置 栈视图 模式为 (默认)悬浮球模式 SHAKE: 摇一摇唤出 NONE:隐藏, 仅在Debug环境生效 19 | .stackViewMode(Fragmentation.BUBBLE) 20 | .debug(true) // 实际场景建议.debug(BuildConfig.DEBUG) 21 | /** 22 | * 可以获取到{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning} 23 | * 在遇到After onSaveInstanceState时,不会抛出异常,会回调到下面的ExceptionHandler 24 | */ 25 | .handleException(new ExceptionHandler() { 26 | @Override 27 | public void onException(Exception e) { 28 | // 以Bugtags为例子: 把捕获到的 Exception 传到 Bugtags 后台。 29 | // Bugtags.sendException(e); 30 | } 31 | }) 32 | .install(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/EnterActivity.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import androidx.annotation.Nullable; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.appcompat.widget.Toolbar; 8 | import android.view.View; 9 | 10 | import me.yokeyword.sample.demo_flow.MainActivity; 11 | 12 | /** 13 | * Created by YoKeyword on 16/6/5. 14 | */ 15 | public class EnterActivity extends AppCompatActivity { 16 | 17 | @Override 18 | protected void onCreate(@Nullable Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_enter); 21 | 22 | initView(); 23 | } 24 | 25 | private void initView() { 26 | Toolbar toolBar = (Toolbar) findViewById(R.id.toolbar); 27 | setSupportActionBar(toolBar); 28 | 29 | findViewById(R.id.btn_flow).setOnClickListener(new View.OnClickListener() { 30 | @Override 31 | public void onClick(View v) { 32 | startActivity(new Intent(EnterActivity.this, MainActivity.class)); 33 | } 34 | }); 35 | 36 | findViewById(R.id.btn_wechat).setOnClickListener(new View.OnClickListener() { 37 | @Override 38 | public void onClick(View v) { 39 | startActivity(new Intent(EnterActivity.this, me.yokeyword.sample.demo_wechat.MainActivity.class)); 40 | } 41 | }); 42 | 43 | findViewById(R.id.btn_zhihu).setOnClickListener(new View.OnClickListener() { 44 | @Override 45 | public void onClick(View v) { 46 | startActivity(new Intent(EnterActivity.this, me.yokeyword.sample.demo_zhihu.MainActivity.class)); 47 | } 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/SwipeBackSampleActivity.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow; 2 | 3 | import android.os.Bundle; 4 | 5 | import me.yokeyword.fragmentation.SwipeBackLayout; 6 | import me.yokeyword.fragmentation.anim.DefaultHorizontalAnimator; 7 | import me.yokeyword.fragmentation.anim.FragmentAnimator; 8 | import me.yokeyword.fragmentation_swipeback.SwipeBackActivity; 9 | import me.yokeyword.sample.R; 10 | import me.yokeyword.sample.demo_flow.ui.fragment_swipe_back.FirstSwipeBackFragment; 11 | 12 | /** 13 | * Created by YoKeyword on 16/4/19. 14 | */ 15 | public class SwipeBackSampleActivity extends SwipeBackActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_swipe_back); 21 | 22 | if (findFragment(FirstSwipeBackFragment.class) == null) { 23 | loadRootFragment(R.id.fl_container, FirstSwipeBackFragment.newInstance()); 24 | } 25 | 26 | getSwipeBackLayout().setEdgeOrientation(SwipeBackLayout.EDGE_ALL); 27 | } 28 | 29 | /** 30 | * 限制SwipeBack的条件,默认栈内Fragment数 <= 1时 , 优先滑动退出Activity , 而不是Fragment 31 | * 32 | * @return true: Activity优先滑动退出; false: Fragment优先滑动退出 33 | */ 34 | @Override 35 | public boolean swipeBackPriority() { 36 | return super.swipeBackPriority(); 37 | } 38 | 39 | public FragmentAnimator onCreateFragmentAnimator() { 40 | return new DefaultHorizontalAnimator(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/adapter/DiscoverFragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.adapter; 2 | 3 | import androidx.fragment.app.Fragment; 4 | import androidx.fragment.app.FragmentManager; 5 | import androidx.fragment.app.FragmentPagerAdapter; 6 | 7 | import me.yokeyword.sample.demo_flow.ui.fragment.discover.PagerChildFragment; 8 | 9 | /** 10 | * Created by YoKeyword on 16/2/5. 11 | */ 12 | public class DiscoverFragmentAdapter extends FragmentPagerAdapter { 13 | String[] mTitles; 14 | 15 | public DiscoverFragmentAdapter(FragmentManager fm, String... titles) { 16 | super(fm); 17 | mTitles = titles; 18 | } 19 | 20 | @Override 21 | public Fragment getItem(int position) { 22 | if (position == 0) { 23 | return PagerChildFragment.newInstance(0); 24 | } else if (position == 1) { 25 | return PagerChildFragment.newInstance(1); 26 | } else { 27 | return PagerChildFragment.newInstance(2); 28 | } 29 | } 30 | 31 | @Override 32 | public int getCount() { 33 | return mTitles.length; 34 | } 35 | 36 | @Override 37 | public CharSequence getPageTitle(int position) { 38 | return mTitles[position]; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/adapter/HomeAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.adapter; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_flow.listener.OnItemClickListener; 15 | import me.yokeyword.sample.demo_flow.entity.Article; 16 | 17 | /** 18 | * 主页HomeFragment Adapter 19 | * Created by YoKeyword on 16/2/1. 20 | */ 21 | public class HomeAdapter extends RecyclerView.Adapter { 22 | private List
mItems = new ArrayList<>(); 23 | private LayoutInflater mInflater; 24 | 25 | private OnItemClickListener mClickListener; 26 | 27 | public HomeAdapter(Context context) { 28 | this.mInflater = LayoutInflater.from(context); 29 | } 30 | 31 | public void setDatas(List
items) { 32 | mItems.clear(); 33 | mItems.addAll(items); 34 | } 35 | 36 | @Override 37 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 38 | View view = mInflater.inflate(R.layout.item_home, parent, false); 39 | final MyViewHolder holder = new MyViewHolder(view); 40 | holder.itemView.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | int position = holder.getAdapterPosition(); 44 | if (mClickListener != null) { 45 | mClickListener.onItemClick(position, v); 46 | } 47 | } 48 | }); 49 | return holder; 50 | } 51 | 52 | @Override 53 | public void onBindViewHolder(MyViewHolder holder, int position) { 54 | Article item = mItems.get(position); 55 | holder.tvTitle.setText(item.getTitle()); 56 | holder.tvContent.setText(item.getContent()); 57 | } 58 | 59 | @Override 60 | public int getItemCount() { 61 | return mItems.size(); 62 | } 63 | 64 | public Article getItem(int position) { 65 | return mItems.get(position); 66 | } 67 | 68 | class MyViewHolder extends RecyclerView.ViewHolder { 69 | private TextView tvTitle, tvContent; 70 | 71 | public MyViewHolder(View itemView) { 72 | super(itemView); 73 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 74 | tvContent = (TextView) itemView.findViewById(R.id.tv_content); 75 | } 76 | } 77 | 78 | public void setOnItemClickListener(OnItemClickListener itemClickListener) { 79 | this.mClickListener = itemClickListener; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/adapter/PagerAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.adapter; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_flow.listener.OnItemClickListener; 15 | 16 | /** 17 | * 发现Discover里的子Fragment Adapter 18 | * Created by YoKeyword on 16/2/1. 19 | */ 20 | public class PagerAdapter extends RecyclerView.Adapter { 21 | private List mItems = new ArrayList<>(); 22 | private LayoutInflater mInflater; 23 | 24 | private OnItemClickListener mClickListener; 25 | 26 | public PagerAdapter(Context context) { 27 | this.mInflater = LayoutInflater.from(context); 28 | } 29 | 30 | public void setDatas(List items) { 31 | mItems.clear(); 32 | mItems.addAll(items); 33 | notifyDataSetChanged(); 34 | } 35 | 36 | @Override 37 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 38 | View view = mInflater.inflate(R.layout.item_pager, parent, false); 39 | final MyViewHolder holder = new MyViewHolder(view); 40 | holder.itemView.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | int position = holder.getAdapterPosition(); 44 | if (mClickListener != null) { 45 | mClickListener.onItemClick(position, v); 46 | } 47 | } 48 | }); 49 | return holder; 50 | } 51 | 52 | @Override 53 | public void onBindViewHolder(MyViewHolder holder, int position) { 54 | String item = mItems.get(position); 55 | holder.tvTitle.setText(item); 56 | } 57 | 58 | @Override 59 | public int getItemCount() { 60 | return mItems.size(); 61 | } 62 | 63 | class MyViewHolder extends RecyclerView.ViewHolder { 64 | private TextView tvTitle; 65 | 66 | public MyViewHolder(View itemView) { 67 | super(itemView); 68 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 69 | } 70 | } 71 | 72 | public void setOnItemClickListener(OnItemClickListener itemClickListener) { 73 | this.mClickListener = itemClickListener; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/base/BaseBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.base; 2 | 3 | import androidx.appcompat.widget.Toolbar; 4 | import android.view.View; 5 | 6 | import me.yokeyword.sample.R; 7 | 8 | /** 9 | * Created by YoKeyword on 16/2/7. 10 | */ 11 | public class BaseBackFragment extends MySupportFragment { 12 | 13 | protected void initToolbarNav(Toolbar toolbar) { 14 | toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 15 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 16 | @Override 17 | public void onClick(View v) { 18 | pop(); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/base/BaseMainFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.base; 2 | 3 | import android.content.Context; 4 | import androidx.appcompat.widget.Toolbar; 5 | import android.view.View; 6 | 7 | import me.yokeyword.sample.R; 8 | 9 | 10 | /** 11 | * Created by YoKeyword on 16/2/3. 12 | */ 13 | public class BaseMainFragment extends MySupportFragment { 14 | 15 | protected OnFragmentOpenDrawerListener mOpenDraweListener; 16 | 17 | protected void initToolbarNav(Toolbar toolbar) { 18 | initToolbarNav(toolbar, false); 19 | } 20 | 21 | protected void initToolbarNav(Toolbar toolbar, boolean isHome) { 22 | toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); 23 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 24 | @Override 25 | public void onClick(View v) { 26 | if (mOpenDraweListener != null) { 27 | mOpenDraweListener.onOpenDrawer(); 28 | } 29 | } 30 | }); 31 | } 32 | 33 | @Override 34 | public void onAttach(Context context) { 35 | super.onAttach(context); 36 | if (context instanceof OnFragmentOpenDrawerListener) { 37 | mOpenDraweListener = (OnFragmentOpenDrawerListener) context; 38 | } else { 39 | // throw new RuntimeException(context.toString() 40 | // + " must implement OnFragmentOpenDrawerListener"); 41 | } 42 | } 43 | 44 | @Override 45 | public void onDetach() { 46 | super.onDetach(); 47 | mOpenDraweListener = null; 48 | } 49 | 50 | public interface OnFragmentOpenDrawerListener { 51 | void onOpenDrawer(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/entity/Article.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | /** 7 | * Created by YoKeyword on 16/2/1. 8 | */ 9 | public class Article implements Parcelable{ 10 | private String title; 11 | private String content; 12 | private int imgRes; 13 | 14 | public Article(String title, String content) { 15 | this.title = title; 16 | this.content = content; 17 | } 18 | 19 | public Article(String title, int imgRes) { 20 | this.title = title; 21 | this.imgRes = imgRes; 22 | } 23 | 24 | protected Article(Parcel in) { 25 | title = in.readString(); 26 | content = in.readString(); 27 | imgRes = in.readInt(); 28 | } 29 | 30 | public static final Creator
CREATOR = new Creator
() { 31 | @Override 32 | public Article createFromParcel(Parcel in) { 33 | return new Article(in); 34 | } 35 | 36 | @Override 37 | public Article[] newArray(int size) { 38 | return new Article[size]; 39 | } 40 | }; 41 | 42 | public String getTitle() { 43 | return title; 44 | } 45 | 46 | public void setTitle(String title) { 47 | this.title = title; 48 | } 49 | 50 | public String getContent() { 51 | return content; 52 | } 53 | 54 | public void setContent(String content) { 55 | this.content = content; 56 | } 57 | 58 | public int getImgRes() { 59 | return imgRes; 60 | } 61 | 62 | public void setImgRes(int imgRes) { 63 | this.imgRes = imgRes; 64 | } 65 | 66 | @Override 67 | public int describeContents() { 68 | return 0; 69 | } 70 | 71 | @Override 72 | public void writeToParcel(Parcel dest, int flags) { 73 | dest.writeString(title); 74 | dest.writeString(content); 75 | dest.writeInt(imgRes); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/listener/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.listener; 2 | 3 | import android.view.View; 4 | 5 | public interface OnItemClickListener { 6 | void onItemClick(int position, View view); 7 | } -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/ui/fragment/CycleFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.Button; 10 | import android.widget.TextView; 11 | 12 | import me.yokeyword.sample.R; 13 | import me.yokeyword.sample.demo_flow.base.BaseBackFragment; 14 | 15 | /** 16 | * Created by YoKeyword on 16/2/7. 17 | */ 18 | public class CycleFragment extends BaseBackFragment { 19 | private static final String ARG_NUMBER = "arg_number"; 20 | 21 | private Toolbar mToolbar; 22 | private TextView mTvName; 23 | private Button mBtnNext, mBtnNextWithFinish; 24 | 25 | private int mNumber; 26 | 27 | public static CycleFragment newInstance(int number) { 28 | CycleFragment fragment = new CycleFragment(); 29 | Bundle args = new Bundle(); 30 | args.putInt(ARG_NUMBER, number); 31 | fragment.setArguments(args); 32 | return fragment; 33 | } 34 | 35 | @Override 36 | public void onCreate(@Nullable Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | Bundle args = getArguments(); 39 | if (args != null) { 40 | mNumber = args.getInt(ARG_NUMBER); 41 | } 42 | } 43 | 44 | @Nullable 45 | @Override 46 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 47 | View view = inflater.inflate(R.layout.fragment_cycle, container, false); 48 | initView(view); 49 | return view; 50 | } 51 | 52 | private void initView(View view) { 53 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 54 | mTvName = (TextView) view.findViewById(R.id.tv_name); 55 | mBtnNext = (Button) view.findViewById(R.id.btn_next); 56 | mBtnNextWithFinish = (Button) view.findViewById(R.id.btn_next_with_finish); 57 | 58 | String title = "CyclerFragment " + mNumber; 59 | 60 | mToolbar.setTitle(title); 61 | initToolbarNav(mToolbar); 62 | 63 | mTvName.setText(title); 64 | mBtnNext.setOnClickListener(new View.OnClickListener() { 65 | @Override 66 | public void onClick(View v) { 67 | start(CycleFragment.newInstance(mNumber + 1)); 68 | } 69 | }); 70 | mBtnNextWithFinish.setOnClickListener(new View.OnClickListener() { 71 | @Override 72 | public void onClick(View v) { 73 | startWithPop(CycleFragment.newInstance(mNumber + 1)); 74 | } 75 | }); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/ui/fragment/discover/DiscoverFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.ui.fragment.discover; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import com.google.android.material.tabs.TabLayout; 6 | import androidx.viewpager.widget.ViewPager; 7 | import androidx.appcompat.widget.Toolbar; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_flow.adapter.DiscoverFragmentAdapter; 15 | import me.yokeyword.sample.demo_flow.base.BaseMainFragment; 16 | 17 | /** 18 | * Created by YoKeyword on 16/2/3. 19 | */ 20 | public class DiscoverFragment extends BaseMainFragment { 21 | 22 | public static DiscoverFragment newInstance() { 23 | return new DiscoverFragment(); 24 | } 25 | 26 | @Nullable 27 | @Override 28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 29 | View view = inflater.inflate(R.layout.fragment_discover, container, false); 30 | 31 | initView(view); 32 | 33 | return view; 34 | } 35 | 36 | private void initView(View view) { 37 | Toolbar mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 38 | TabLayout mTabLayout = (TabLayout) view.findViewById(R.id.tab_layout); 39 | ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 40 | 41 | mToolbar.setTitle(R.string.discover); 42 | initToolbarNav(mToolbar); 43 | 44 | mTabLayout.addTab(mTabLayout.newTab().setText(R.string.recommend)); 45 | mTabLayout.addTab(mTabLayout.newTab().setText(R.string.hot)); 46 | mTabLayout.addTab(mTabLayout.newTab().setText(R.string.favorite)); 47 | mViewPager.setAdapter(new DiscoverFragmentAdapter(getChildFragmentManager(), getString(R.string.recommend), getString(R.string.hot), getString(R.string.favorite))); 48 | mTabLayout.setupWithViewPager(mViewPager); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/ui/fragment_swipe_back/BaseSwipeBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.ui.fragment_swipe_back; 2 | 3 | import androidx.appcompat.widget.Toolbar; 4 | import android.view.View; 5 | 6 | import me.yokeyword.fragmentation_swipeback.SwipeBackFragment; 7 | import me.yokeyword.sample.R; 8 | 9 | /** 10 | * Created by YoKeyword on 16/4/21. 11 | */ 12 | public class BaseSwipeBackFragment extends SwipeBackFragment { 13 | 14 | void _initToolbar(Toolbar toolbar) { 15 | toolbar.setTitle("SwipeBackActivity's Fragment"); 16 | toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 17 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 18 | @Override 19 | public void onClick(View v) { 20 | _mActivity.onBackPressed(); 21 | } 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/ui/fragment_swipe_back/FirstSwipeBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.ui.fragment_swipe_back; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import me.yokeyword.sample.R; 11 | 12 | /** 13 | * Created by YoKeyword on 16/4/19. 14 | */ 15 | public class FirstSwipeBackFragment extends BaseSwipeBackFragment { 16 | private Toolbar mToolbar; 17 | 18 | public static FirstSwipeBackFragment newInstance() { 19 | 20 | Bundle args = new Bundle(); 21 | 22 | FirstSwipeBackFragment fragment = new FirstSwipeBackFragment(); 23 | fragment.setArguments(args); 24 | return fragment; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.fragment_swipe_back_first, container, false); 31 | 32 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 33 | mToolbar.setTitle("SwipeBackActivity's Fragment"); 34 | _initToolbar(mToolbar); 35 | 36 | view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { 37 | @Override 38 | public void onClick(View v) { 39 | start(RecyclerSwipeBackFragment.newInstance()); 40 | } 41 | }); 42 | 43 | return attachToSwipeBack(view); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_flow/ui/fragment_swipe_back/RecyclerSwipeBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_flow.ui.fragment_swipe_back; 2 | 3 | import android.os.Bundle; 4 | import androidx.recyclerview.widget.LinearLayoutManager; 5 | import androidx.recyclerview.widget.RecyclerView; 6 | import androidx.appcompat.widget.Toolbar; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import me.yokeyword.sample.R; 15 | import me.yokeyword.sample.demo_flow.adapter.PagerAdapter; 16 | import me.yokeyword.sample.demo_flow.listener.OnItemClickListener; 17 | 18 | 19 | public class RecyclerSwipeBackFragment extends BaseSwipeBackFragment { 20 | private static final String ARG_FROM = "arg_from"; 21 | 22 | private Toolbar mToolbar; 23 | 24 | private RecyclerView mRecy; 25 | private PagerAdapter mAdapter; 26 | 27 | public static RecyclerSwipeBackFragment newInstance() { 28 | RecyclerSwipeBackFragment fragment = new RecyclerSwipeBackFragment(); 29 | return fragment; 30 | } 31 | 32 | @Override 33 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 34 | Bundle savedInstanceState) { 35 | View view = inflater.inflate(R.layout.fragment_swipe_back_recy, container, false); 36 | 37 | initView(view); 38 | 39 | return attachToSwipeBack(view); 40 | } 41 | 42 | private void initView(View view) { 43 | mRecy = (RecyclerView) view.findViewById(R.id.recy); 44 | 45 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 46 | _initToolbar(mToolbar); 47 | 48 | mAdapter = new PagerAdapter(_mActivity); 49 | LinearLayoutManager manager = new LinearLayoutManager(_mActivity); 50 | mRecy.setLayoutManager(manager); 51 | mRecy.setAdapter(mAdapter); 52 | 53 | mAdapter.setOnItemClickListener(new OnItemClickListener() { 54 | @Override 55 | public void onItemClick(int position, View view) { 56 | start(FirstSwipeBackFragment.newInstance()); 57 | } 58 | }); 59 | 60 | // Init Datas 61 | List items = new ArrayList<>(); 62 | for (int i = 0; i < 20; i++) { 63 | String item; 64 | item = getString(R.string.favorite) + " " + i; 65 | items.add(item); 66 | } 67 | mAdapter.setDatas(items); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/MainActivity.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | 6 | import me.yokeyword.fragmentation.SupportActivity; 7 | import me.yokeyword.fragmentation.anim.DefaultHorizontalAnimator; 8 | import me.yokeyword.fragmentation.anim.FragmentAnimator; 9 | import me.yokeyword.sample.R; 10 | import me.yokeyword.sample.demo_wechat.ui.fragment.MainFragment; 11 | 12 | /** 13 | * 仿微信交互方式Demo 14 | * Created by YoKeyword on 16/6/30. 15 | */ 16 | public class MainActivity extends SupportActivity { 17 | 18 | @Override 19 | protected void onCreate(@Nullable Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.wechat_activity_main); 22 | 23 | if (findFragment(MainFragment.class) == null) { 24 | loadRootFragment(R.id.fl_container, MainFragment.newInstance()); 25 | } 26 | } 27 | 28 | @Override 29 | public void onBackPressedSupport() { 30 | // 对于 4个类别的主Fragment内的回退back逻辑,已经在其onBackPressedSupport里各自处理了 31 | super.onBackPressedSupport(); 32 | } 33 | 34 | @Override 35 | public FragmentAnimator onCreateFragmentAnimator() { 36 | // 设置横向(和安卓4.x动画相同) 37 | return new DefaultHorizontalAnimator(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/adapter/HomeAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.adapter; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_wechat.entity.Article; 15 | import me.yokeyword.sample.demo_wechat.listener.OnItemClickListener; 16 | 17 | /** 18 | * 主页HomeFragment Adapter 19 | * Created by YoKeyword on 16/2/1. 20 | */ 21 | public class HomeAdapter extends RecyclerView.Adapter { 22 | private List
mItems = new ArrayList<>(); 23 | private LayoutInflater mInflater; 24 | 25 | private OnItemClickListener mClickListener; 26 | 27 | public HomeAdapter(Context context) { 28 | this.mInflater = LayoutInflater.from(context); 29 | } 30 | 31 | public void setDatas(List
items) { 32 | mItems.clear(); 33 | mItems.addAll(items); 34 | } 35 | 36 | @Override 37 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 38 | View view = mInflater.inflate(R.layout.item_home, parent, false); 39 | final MyViewHolder holder = new MyViewHolder(view); 40 | holder.itemView.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | int position = holder.getAdapterPosition(); 44 | if (mClickListener != null) { 45 | mClickListener.onItemClick(position, v, holder); 46 | } 47 | } 48 | }); 49 | return holder; 50 | } 51 | 52 | @Override 53 | public void onBindViewHolder(MyViewHolder holder, int position) { 54 | Article item = mItems.get(position); 55 | holder.tvTitle.setText(item.getTitle()); 56 | holder.tvContent.setText(item.getContent()); 57 | } 58 | 59 | @Override 60 | public int getItemCount() { 61 | return mItems.size(); 62 | } 63 | 64 | public Article getItem(int position) { 65 | return mItems.get(position); 66 | } 67 | 68 | class MyViewHolder extends RecyclerView.ViewHolder { 69 | private TextView tvTitle, tvContent; 70 | 71 | public MyViewHolder(View itemView) { 72 | super(itemView); 73 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 74 | tvContent = (TextView) itemView.findViewById(R.id.tv_content); 75 | } 76 | } 77 | 78 | public void setOnItemClickListener(OnItemClickListener itemClickListener) { 79 | this.mClickListener = itemClickListener; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/adapter/MsgAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.adapter; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import me.yokeyword.sample.R; 15 | import me.yokeyword.sample.demo_wechat.entity.Msg; 16 | import me.yokeyword.sample.demo_wechat.listener.OnItemClickListener; 17 | 18 | /** 19 | * Created by YoKeyword on 16/6/30. 20 | */ 21 | public class MsgAdapter extends RecyclerView.Adapter { 22 | private Context mContext; 23 | private LayoutInflater mInflater; 24 | private List mItems = new ArrayList<>(); 25 | 26 | private OnItemClickListener mClickListener; 27 | 28 | public MsgAdapter(Context context) { 29 | mContext = context; 30 | mInflater = LayoutInflater.from(context); 31 | } 32 | 33 | public void addMsg(Msg bean) { 34 | mItems.add(bean); 35 | notifyItemInserted(mItems.size() - 1); 36 | } 37 | 38 | @Override 39 | public VH onCreateViewHolder(ViewGroup parent, int viewType) { 40 | View view = mInflater.inflate(R.layout.item_wechat_msg, parent, false); 41 | final VH holder = new VH(view); 42 | holder.itemView.setOnClickListener(new View.OnClickListener() { 43 | @Override 44 | public void onClick(View v) { 45 | if (mClickListener != null) { 46 | mClickListener.onItemClick(holder.getAdapterPosition(), v, holder); 47 | } 48 | } 49 | }); 50 | return holder; 51 | } 52 | 53 | @Override 54 | public void onBindViewHolder(VH holder, int position) { 55 | Msg item = mItems.get(position); 56 | 57 | holder.tvMsg.setText(item.message); 58 | } 59 | 60 | @Override 61 | public int getItemCount() { 62 | return mItems.size(); 63 | } 64 | 65 | public void setOnItemClickListener(OnItemClickListener listener) { 66 | mClickListener = listener; 67 | } 68 | 69 | class VH extends RecyclerView.ViewHolder { 70 | private ImageView imgAvatar; 71 | private TextView tvMsg; 72 | 73 | public VH(View itemView) { 74 | super(itemView); 75 | imgAvatar = (ImageView) itemView.findViewById(R.id.img_avatar); 76 | tvMsg = (TextView) itemView.findViewById(R.id.tv_msg); 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/adapter/PagerAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.adapter; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_wechat.listener.OnItemClickListener; 15 | 16 | /** 17 | * Created by YoKeyword on 16/6/30. 18 | */ 19 | public class PagerAdapter extends RecyclerView.Adapter { 20 | private List mItems = new ArrayList<>(); 21 | private LayoutInflater mInflater; 22 | 23 | private OnItemClickListener mClickListener; 24 | 25 | public PagerAdapter(Context context) { 26 | this.mInflater = LayoutInflater.from(context); 27 | } 28 | 29 | public void setDatas(List items) { 30 | mItems.clear(); 31 | mItems.addAll(items); 32 | notifyDataSetChanged(); 33 | } 34 | 35 | @Override 36 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 37 | View view = mInflater.inflate(R.layout.item_pager, parent, false); 38 | final MyViewHolder holder = new MyViewHolder(view); 39 | holder.itemView.setOnClickListener(new View.OnClickListener() { 40 | @Override 41 | public void onClick(View v) { 42 | int position = holder.getAdapterPosition(); 43 | if (mClickListener != null) { 44 | mClickListener.onItemClick(position, v, holder); 45 | } 46 | } 47 | }); 48 | return holder; 49 | } 50 | 51 | @Override 52 | public void onBindViewHolder(MyViewHolder holder, int position) { 53 | String item = mItems.get(position); 54 | holder.tvTitle.setText(item); 55 | } 56 | 57 | @Override 58 | public int getItemCount() { 59 | return mItems.size(); 60 | } 61 | 62 | class MyViewHolder extends RecyclerView.ViewHolder { 63 | private TextView tvTitle; 64 | 65 | public MyViewHolder(View itemView) { 66 | super(itemView); 67 | tvTitle = (TextView) itemView.findViewById(R.id.tv_title); 68 | } 69 | } 70 | 71 | public void setOnItemClickListener(OnItemClickListener itemClickListener) { 72 | this.mClickListener = itemClickListener; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/adapter/WechatPagerFragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.adapter; 2 | 3 | import androidx.fragment.app.Fragment; 4 | import androidx.fragment.app.FragmentManager; 5 | import androidx.fragment.app.FragmentPagerAdapter; 6 | 7 | import me.yokeyword.sample.demo_wechat.ui.fragment.second.FirstPagerFragment; 8 | import me.yokeyword.sample.demo_wechat.ui.fragment.second.OtherPagerFragment; 9 | 10 | 11 | /** 12 | * Created by YoKeyword on 16/6/5. 13 | */ 14 | public class WechatPagerFragmentAdapter extends FragmentPagerAdapter { 15 | private String[] mTitles; 16 | 17 | public WechatPagerFragmentAdapter(FragmentManager fm, String... titles) { 18 | super(fm); 19 | mTitles = titles; 20 | } 21 | 22 | @Override 23 | public Fragment getItem(int position) { 24 | if (position == 0) { 25 | return FirstPagerFragment.newInstance(); 26 | } else { 27 | return OtherPagerFragment.newInstance(); 28 | } 29 | } 30 | 31 | @Override 32 | public int getCount() { 33 | return mTitles.length; 34 | } 35 | 36 | @Override 37 | public CharSequence getPageTitle(int position) { 38 | return mTitles[position]; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/base/BaseBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.base; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.View; 7 | 8 | import me.yokeyword.fragmentation_swipeback.SwipeBackFragment; 9 | import me.yokeyword.sample.R; 10 | 11 | /** 12 | * Created by YoKeyword on 16/2/7. 13 | */ 14 | public class BaseBackFragment extends SwipeBackFragment { 15 | private static final String TAG = "Fragmentation"; 16 | 17 | @Override 18 | public void onActivityCreated(@Nullable Bundle savedInstanceState) { 19 | super.onActivityCreated(savedInstanceState); 20 | setParallaxOffset(0.5f); 21 | } 22 | 23 | protected void initToolbarNav(Toolbar toolbar) { 24 | toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 25 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 26 | @Override 27 | public void onClick(View v) { 28 | _mActivity.onBackPressed(); 29 | } 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/base/BaseMainFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.base; 2 | 3 | import android.widget.Toast; 4 | 5 | import me.yokeyword.fragmentation.SupportFragment; 6 | import me.yokeyword.sample.R; 7 | 8 | /** 9 | * 懒加载 10 | * Created by YoKeyword on 16/6/5. 11 | */ 12 | public abstract class BaseMainFragment extends SupportFragment { 13 | // 再点一次退出程序时间设置 14 | private static final long WAIT_TIME = 2000L; 15 | private long TOUCH_TIME = 0; 16 | 17 | /** 18 | * 处理回退事件 19 | * 20 | * @return 21 | */ 22 | @Override 23 | public boolean onBackPressedSupport() { 24 | if (System.currentTimeMillis() - TOUCH_TIME < WAIT_TIME) { 25 | _mActivity.finish(); 26 | } else { 27 | TOUCH_TIME = System.currentTimeMillis(); 28 | Toast.makeText(_mActivity, R.string.press_again_exit, Toast.LENGTH_SHORT).show(); 29 | } 30 | return true; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/entity/Article.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | /** 7 | * Created by YoKeyword on 16/2/1. 8 | */ 9 | public class Article implements Parcelable{ 10 | private String title; 11 | private String content; 12 | private int imgRes; 13 | 14 | public Article(String title, String content) { 15 | this.title = title; 16 | this.content = content; 17 | } 18 | 19 | public Article(String title, int imgRes) { 20 | this.title = title; 21 | this.imgRes = imgRes; 22 | } 23 | 24 | protected Article(Parcel in) { 25 | title = in.readString(); 26 | content = in.readString(); 27 | imgRes = in.readInt(); 28 | } 29 | 30 | public static final Creator
CREATOR = new Creator
() { 31 | @Override 32 | public Article createFromParcel(Parcel in) { 33 | return new Article(in); 34 | } 35 | 36 | @Override 37 | public Article[] newArray(int size) { 38 | return new Article[size]; 39 | } 40 | }; 41 | 42 | public String getTitle() { 43 | return title; 44 | } 45 | 46 | public void setTitle(String title) { 47 | this.title = title; 48 | } 49 | 50 | public String getContent() { 51 | return content; 52 | } 53 | 54 | public void setContent(String content) { 55 | this.content = content; 56 | } 57 | 58 | public int getImgRes() { 59 | return imgRes; 60 | } 61 | 62 | public void setImgRes(int imgRes) { 63 | this.imgRes = imgRes; 64 | } 65 | 66 | @Override 67 | public int describeContents() { 68 | return 0; 69 | } 70 | 71 | @Override 72 | public void writeToParcel(Parcel dest, int flags) { 73 | dest.writeString(title); 74 | dest.writeString(content); 75 | dest.writeInt(imgRes); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/entity/Chat.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | /** 7 | * Created by YoKeyword on 16/6/30. 8 | */ 9 | public class Chat implements Parcelable { 10 | public String name; 11 | public String message; 12 | public long time; 13 | public int avatar; 14 | 15 | public Chat() { 16 | } 17 | 18 | protected Chat(Parcel in) { 19 | name = in.readString(); 20 | message = in.readString(); 21 | time = in.readLong(); 22 | avatar = in.readInt(); 23 | } 24 | 25 | @Override 26 | public void writeToParcel(Parcel dest, int flags) { 27 | dest.writeString(name); 28 | dest.writeString(message); 29 | dest.writeLong(time); 30 | dest.writeInt(avatar); 31 | } 32 | 33 | @Override 34 | public int describeContents() { 35 | return 0; 36 | } 37 | 38 | public static final Creator CREATOR = new Creator() { 39 | @Override 40 | public Chat createFromParcel(Parcel in) { 41 | return new Chat(in); 42 | } 43 | 44 | @Override 45 | public Chat[] newArray(int size) { 46 | return new Chat[size]; 47 | } 48 | }; 49 | } 50 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/entity/Msg.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.entity; 2 | 3 | /** 4 | * Created by YoKeyword on 16/6/30. 5 | */ 6 | public class Msg { 7 | public String message; 8 | 9 | public Msg(){} 10 | 11 | public Msg(String msg){ 12 | message = msg; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/event/StartBrotherEvent.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.event; 2 | 3 | import me.yokeyword.fragmentation.SupportFragment; 4 | 5 | /** 6 | * Created by YoKeyword on 16/6/30. 7 | */ 8 | public class StartBrotherEvent { 9 | public SupportFragment targetFragment; 10 | 11 | public StartBrotherEvent(SupportFragment targetFragment) { 12 | this.targetFragment = targetFragment; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/event/TabSelectedEvent.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.event; 2 | 3 | /** 4 | * Created by YoKeyword on 16/6/5. 5 | */ 6 | public class TabSelectedEvent { 7 | public int position; 8 | 9 | public TabSelectedEvent(int position) { 10 | this.position = position; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/listener/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.listener; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | import android.view.View; 5 | 6 | public interface OnItemClickListener { 7 | void onItemClick(int position, View view, RecyclerView.ViewHolder vh); 8 | } -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/ui/fragment/CycleFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.Button; 10 | import android.widget.TextView; 11 | 12 | import me.yokeyword.sample.R; 13 | import me.yokeyword.sample.demo_wechat.base.BaseBackFragment; 14 | 15 | /** 16 | * Created by YoKeyword on 16/2/7. 17 | */ 18 | public class CycleFragment extends BaseBackFragment { 19 | private static final String ARG_NUMBER = "arg_number"; 20 | 21 | private Toolbar mToolbar; 22 | private TextView mTvName; 23 | private Button mBtnNext, mBtnNextWithFinish; 24 | 25 | private int mNumber; 26 | 27 | public static CycleFragment newInstance(int number) { 28 | CycleFragment fragment = new CycleFragment(); 29 | Bundle args = new Bundle(); 30 | args.putInt(ARG_NUMBER, number); 31 | fragment.setArguments(args); 32 | return fragment; 33 | } 34 | 35 | @Override 36 | public void onCreate(@Nullable Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | Bundle args = getArguments(); 39 | if (args != null) { 40 | mNumber = args.getInt(ARG_NUMBER); 41 | } 42 | } 43 | 44 | @Nullable 45 | @Override 46 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 47 | View view = inflater.inflate(R.layout.fragment_cycle, container, false); 48 | initView(view); 49 | return attachToSwipeBack(view); 50 | } 51 | 52 | private void initView(View view) { 53 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 54 | mTvName = (TextView) view.findViewById(R.id.tv_name); 55 | mBtnNext = (Button) view.findViewById(R.id.btn_next); 56 | mBtnNextWithFinish = (Button) view.findViewById(R.id.btn_next_with_finish); 57 | 58 | String title = "CyclerFragment " + mNumber; 59 | 60 | mToolbar.setTitle(title); 61 | initToolbarNav(mToolbar); 62 | 63 | mTvName.setText(title + "\n"+getString(R.string.can_swipe)); 64 | mBtnNext.setOnClickListener(new View.OnClickListener() { 65 | @Override 66 | public void onClick(View v) { 67 | start(CycleFragment.newInstance(mNumber + 1)); 68 | } 69 | }); 70 | mBtnNextWithFinish.setOnClickListener(new View.OnClickListener() { 71 | @Override 72 | public void onClick(View v) { 73 | startWithPop(CycleFragment.newInstance(mNumber + 1)); 74 | } 75 | }); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/ui/fragment/second/DemoDialogFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.ui.fragment.second; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.annotation.Nullable; 11 | import androidx.fragment.app.DialogFragment; 12 | import androidx.fragment.app.FragmentActivity; 13 | import androidx.fragment.app.FragmentManager; 14 | import me.yokeyword.fragmentation.ISupportActivity; 15 | import me.yokeyword.sample.R; 16 | 17 | /** 18 | * 使用DialogFragment时,需要重写show(),入Fragmentation的事务队列 19 | * 20 | * Dialog是基于Window (Activity也是Window),普通Fragment的视图一般基于View,这样会导致Dialog永远会浮在最顶层 21 | * 22 | * 可以考虑自定义半透明View的Fragment,从视觉上模拟Dialog 23 | * 24 | * Created by YoKey on 19/6/7. 25 | */ 26 | 27 | public class DemoDialogFragment extends DialogFragment { 28 | 29 | public static DemoDialogFragment newInstance() { 30 | return new DemoDialogFragment(); 31 | } 32 | 33 | protected FragmentActivity _mActivity; 34 | 35 | @Override 36 | public void onAttach(Activity activity) { 37 | super.onAttach(activity); 38 | _mActivity = (FragmentActivity) activity; 39 | } 40 | 41 | /** 42 | * Enqueue the Fragmentation Queue. 43 | * 44 | * 如果是SupportFragment打开,可以不用复写该方法, 放到post()中show亦可 45 | */ 46 | @Override 47 | public void show(final FragmentManager manager, final String tag) { 48 | if (_mActivity instanceof ISupportActivity) { 49 | ((ISupportActivity) _mActivity).getSupportDelegate().post(new Runnable() { 50 | @Override 51 | public void run() { 52 | DemoDialogFragment.super.show(manager, tag); 53 | } 54 | }); 55 | return; 56 | } 57 | 58 | super.show(manager, tag); 59 | } 60 | 61 | @Nullable 62 | @Override 63 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 64 | View view = inflater.inflate(R.layout.wechat_fragment_dialog, container, false); 65 | view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { 66 | @Override 67 | public void onClick(View view) { 68 | dismiss(); 69 | } 70 | }); 71 | return view; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/ui/fragment/second/OtherPagerFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.ui.fragment.second; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.fragmentation.SupportFragment; 10 | import me.yokeyword.sample.R; 11 | 12 | /** 13 | * Created by YoKeyword on 16/6/30. 14 | */ 15 | public class OtherPagerFragment extends SupportFragment { 16 | 17 | public static OtherPagerFragment newInstance() { 18 | 19 | Bundle args = new Bundle(); 20 | OtherPagerFragment fragment = new OtherPagerFragment(); 21 | fragment.setArguments(args); 22 | return fragment; 23 | } 24 | 25 | @Nullable 26 | @Override 27 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 28 | View view = inflater.inflate(R.layout.wechat_fragment_tab_second_pager_other, container, false); 29 | return view; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/ui/fragment/second/ViewFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.ui.fragment.second; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.fragmentation.SupportFragment; 10 | import me.yokeyword.sample.R; 11 | 12 | /** 13 | * Created by YoKey on 17/8/1. 14 | */ 15 | 16 | public class ViewFragment extends SupportFragment { 17 | 18 | public static ViewFragment newInstance() { 19 | 20 | Bundle args = new Bundle(); 21 | 22 | ViewFragment fragment = new ViewFragment(); 23 | fragment.setArguments(args); 24 | return fragment; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.wechat_fragment_view, container, false); 31 | return view; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_wechat/ui/fragment/second/WechatSecondTabFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_wechat.ui.fragment.second; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import com.google.android.material.tabs.TabLayout; 6 | import androidx.viewpager.widget.ViewPager; 7 | import androidx.appcompat.widget.Toolbar; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | 12 | import me.yokeyword.sample.R; 13 | import me.yokeyword.sample.demo_wechat.adapter.WechatPagerFragmentAdapter; 14 | import me.yokeyword.sample.demo_wechat.base.BaseMainFragment; 15 | 16 | /** 17 | * Created by YoKeyword on 16/6/30. 18 | */ 19 | public class WechatSecondTabFragment extends BaseMainFragment { 20 | private TabLayout mTab; 21 | private Toolbar mToolbar; 22 | private ViewPager mViewPager; 23 | 24 | public static WechatSecondTabFragment newInstance() { 25 | 26 | Bundle args = new Bundle(); 27 | 28 | WechatSecondTabFragment fragment = new WechatSecondTabFragment(); 29 | fragment.setArguments(args); 30 | return fragment; 31 | } 32 | 33 | @Nullable 34 | @Override 35 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 36 | View view = inflater.inflate(R.layout.wechat_fragment_tab_second, container, false); 37 | initView(view); 38 | return view; 39 | } 40 | 41 | private void initView(View view) { 42 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 43 | mTab = (TabLayout) view.findViewById(R.id.tab); 44 | mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 45 | 46 | mToolbar.setTitle(R.string.discover); 47 | 48 | mTab.addTab(mTab.newTab()); 49 | mTab.addTab(mTab.newTab()); 50 | } 51 | 52 | @Override 53 | public void onLazyInitView(@Nullable Bundle savedInstanceState) { 54 | super.onLazyInitView(savedInstanceState); 55 | mViewPager.setAdapter(new WechatPagerFragmentAdapter(getChildFragmentManager() 56 | , getString(R.string.all), getString(R.string.more))); 57 | mTab.setupWithViewPager(mViewPager); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/adapter/ZhihuPagerFragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.adapter; 2 | 3 | import androidx.fragment.app.Fragment; 4 | import androidx.fragment.app.FragmentManager; 5 | import androidx.fragment.app.FragmentPagerAdapter; 6 | 7 | import me.yokeyword.sample.demo_zhihu.ui.fragment.second.child.childpager.FirstPagerFragment; 8 | import me.yokeyword.sample.demo_zhihu.ui.fragment.second.child.childpager.OtherPagerFragment; 9 | 10 | /** 11 | * Created by YoKeyword on 16/6/5. 12 | */ 13 | public class ZhihuPagerFragmentAdapter extends FragmentPagerAdapter { 14 | private String[] mTitles; 15 | 16 | public ZhihuPagerFragmentAdapter(FragmentManager fm, String... titles) { 17 | super(fm); 18 | mTitles = titles; 19 | } 20 | 21 | @Override 22 | public Fragment getItem(int position) { 23 | if (position == 0) { 24 | return FirstPagerFragment.newInstance(); 25 | } else { 26 | return OtherPagerFragment.newInstance(mTitles[position]); 27 | } 28 | } 29 | 30 | @Override 31 | public int getCount() { 32 | return mTitles.length; 33 | } 34 | 35 | @Override 36 | public CharSequence getPageTitle(int position) { 37 | return mTitles[position]; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/base/BaseBackFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.base; 2 | 3 | import androidx.appcompat.widget.Toolbar; 4 | import android.view.View; 5 | 6 | import me.yokeyword.fragmentation.SupportFragment; 7 | import me.yokeyword.sample.R; 8 | 9 | /** 10 | * Created by YoKeyword on 16/2/7. 11 | */ 12 | public class BaseBackFragment extends SupportFragment { 13 | 14 | protected void initToolbarNav(Toolbar toolbar) { 15 | toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 16 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 17 | @Override 18 | public void onClick(View v) { 19 | _mActivity.onBackPressed(); 20 | } 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/base/BaseMainFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.base; 2 | 3 | import android.content.Context; 4 | 5 | import me.yokeyword.fragmentation.SupportFragment; 6 | import me.yokeyword.sample.demo_zhihu.ui.fragment.first.ZhihuFirstFragment; 7 | 8 | /** 9 | * 懒加载 10 | * Created by YoKeyword on 16/6/5. 11 | */ 12 | public abstract class BaseMainFragment extends SupportFragment { 13 | protected OnBackToFirstListener _mBackToFirstListener; 14 | 15 | @Override 16 | public void onAttach(Context context) { 17 | super.onAttach(context); 18 | if (context instanceof OnBackToFirstListener) { 19 | _mBackToFirstListener = (OnBackToFirstListener) context; 20 | } else { 21 | throw new RuntimeException(context.toString() 22 | + " must implement OnBackToFirstListener"); 23 | } 24 | } 25 | 26 | @Override 27 | public void onDetach() { 28 | super.onDetach(); 29 | _mBackToFirstListener = null; 30 | } 31 | 32 | /** 33 | * 处理回退事件 34 | * 35 | * @return 36 | */ 37 | @Override 38 | public boolean onBackPressedSupport() { 39 | if (getChildFragmentManager().getBackStackEntryCount() > 1) { 40 | popChild(); 41 | } else { 42 | if (this instanceof ZhihuFirstFragment) { // 如果是 第一个Fragment 则退出app 43 | _mActivity.finish(); 44 | } else { // 如果不是,则回到第一个Fragment 45 | _mBackToFirstListener.onBackToFirstFragment(); 46 | } 47 | } 48 | return true; 49 | } 50 | 51 | public interface OnBackToFirstListener { 52 | void onBackToFirstFragment(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/entity/Article.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | /** 7 | * Created by YoKeyword on 16/2/1. 8 | */ 9 | public class Article implements Parcelable{ 10 | private String title; 11 | private String content; 12 | private int imgRes; 13 | 14 | public Article(String title, String content) { 15 | this.title = title; 16 | this.content = content; 17 | } 18 | 19 | public Article(String title, int imgRes) { 20 | this.title = title; 21 | this.imgRes = imgRes; 22 | } 23 | 24 | protected Article(Parcel in) { 25 | title = in.readString(); 26 | content = in.readString(); 27 | imgRes = in.readInt(); 28 | } 29 | 30 | public static final Creator
CREATOR = new Creator
() { 31 | @Override 32 | public Article createFromParcel(Parcel in) { 33 | return new Article(in); 34 | } 35 | 36 | @Override 37 | public Article[] newArray(int size) { 38 | return new Article[size]; 39 | } 40 | }; 41 | 42 | public String getTitle() { 43 | return title; 44 | } 45 | 46 | public void setTitle(String title) { 47 | this.title = title; 48 | } 49 | 50 | public String getContent() { 51 | return content; 52 | } 53 | 54 | public void setContent(String content) { 55 | this.content = content; 56 | } 57 | 58 | public int getImgRes() { 59 | return imgRes; 60 | } 61 | 62 | public void setImgRes(int imgRes) { 63 | this.imgRes = imgRes; 64 | } 65 | 66 | @Override 67 | public int describeContents() { 68 | return 0; 69 | } 70 | 71 | @Override 72 | public void writeToParcel(Parcel dest, int flags) { 73 | dest.writeString(title); 74 | dest.writeString(content); 75 | dest.writeInt(imgRes); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/event/TabSelectedEvent.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.event; 2 | 3 | /** 4 | * Created by YoKeyword on 16/6/5. 5 | */ 6 | public class TabSelectedEvent { 7 | public int position; 8 | 9 | public TabSelectedEvent(int position) { 10 | this.position = position; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/helper/DetailTransition.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.helper; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.transition.ChangeBounds; 7 | import android.transition.ChangeImageTransform; 8 | import android.transition.ChangeTransform; 9 | import android.transition.TransitionSet; 10 | import android.util.AttributeSet; 11 | 12 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 13 | public class DetailTransition extends TransitionSet { 14 | public DetailTransition() { 15 | init(); 16 | } 17 | 18 | // 允许资源文件使用 19 | public DetailTransition(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | init(); 22 | } 23 | 24 | private void init() { 25 | setOrdering(ORDERING_TOGETHER); 26 | addTransition(new ChangeBounds()). 27 | addTransition(new ChangeTransform()). 28 | addTransition(new ChangeImageTransform()); 29 | } 30 | } -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/listener/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.listener; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | import android.view.View; 5 | 6 | public interface OnItemClickListener { 7 | void onItemClick(int position, View view, RecyclerView.ViewHolder vh); 8 | } -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/CycleFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.Button; 10 | import android.widget.TextView; 11 | 12 | import me.yokeyword.sample.R; 13 | import me.yokeyword.sample.demo_zhihu.base.BaseBackFragment; 14 | 15 | /** 16 | * Created by YoKeyword on 16/2/7. 17 | */ 18 | public class CycleFragment extends BaseBackFragment { 19 | private static final String ARG_NUMBER = "arg_number"; 20 | 21 | private Toolbar mToolbar; 22 | private TextView mTvName; 23 | private Button mBtnNext, mBtnNextWithFinish; 24 | 25 | private int mNumber; 26 | 27 | public static CycleFragment newInstance(int number) { 28 | CycleFragment fragment = new CycleFragment(); 29 | Bundle args = new Bundle(); 30 | args.putInt(ARG_NUMBER, number); 31 | fragment.setArguments(args); 32 | return fragment; 33 | } 34 | 35 | @Override 36 | public void onCreate(@Nullable Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | Bundle args = getArguments(); 39 | if (args != null) { 40 | mNumber = args.getInt(ARG_NUMBER); 41 | } 42 | } 43 | 44 | @Nullable 45 | @Override 46 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 47 | View view = inflater.inflate(R.layout.fragment_cycle, container, false); 48 | initView(view); 49 | return view; 50 | } 51 | 52 | 53 | private void initView(View view) { 54 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 55 | mTvName = (TextView) view.findViewById(R.id.tv_name); 56 | mBtnNext = (Button) view.findViewById(R.id.btn_next); 57 | mBtnNextWithFinish = (Button) view.findViewById(R.id.btn_next_with_finish); 58 | 59 | String title = "CyclerFragment " + mNumber; 60 | 61 | mToolbar.setTitle(title); 62 | initToolbarNav(mToolbar); 63 | 64 | mTvName.setText(title); 65 | mBtnNext.setOnClickListener(new View.OnClickListener() { 66 | @Override 67 | public void onClick(View v) { 68 | start(CycleFragment.newInstance(mNumber + 1)); 69 | } 70 | }); 71 | mBtnNextWithFinish.setOnClickListener(new View.OnClickListener() { 72 | @Override 73 | public void onClick(View v) { 74 | startWithPop(CycleFragment.newInstance(mNumber + 1)); 75 | } 76 | }); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/first/ZhihuFirstFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.first; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.sample.R; 10 | import me.yokeyword.sample.demo_zhihu.base.BaseMainFragment; 11 | import me.yokeyword.sample.demo_zhihu.ui.fragment.first.child.FirstHomeFragment; 12 | 13 | /** 14 | * Created by YoKeyword on 16/6/3. 15 | */ 16 | public class ZhihuFirstFragment extends BaseMainFragment { 17 | 18 | public static ZhihuFirstFragment newInstance() { 19 | 20 | Bundle args = new Bundle(); 21 | 22 | ZhihuFirstFragment fragment = new ZhihuFirstFragment(); 23 | fragment.setArguments(args); 24 | return fragment; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.zhihu_fragment_first, container, false); 31 | return view; 32 | } 33 | 34 | @Override 35 | public void onLazyInitView(@Nullable Bundle savedInstanceState) { 36 | super.onLazyInitView(savedInstanceState); 37 | 38 | if (findChildFragment(FirstHomeFragment.class) == null) { 39 | loadRootFragment(R.id.fl_first_container, FirstHomeFragment.newInstance()); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/first/child/FirstDetailFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.first.child; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import com.google.android.material.floatingactionbutton.FloatingActionButton; 6 | import androidx.appcompat.widget.Toolbar; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import me.yokeyword.sample.R; 14 | import me.yokeyword.sample.demo_zhihu.base.BaseBackFragment; 15 | import me.yokeyword.sample.demo_zhihu.entity.Article; 16 | import me.yokeyword.sample.demo_zhihu.ui.fragment.CycleFragment; 17 | 18 | /** 19 | * Created by YoKeyword on 16/6/5. 20 | */ 21 | public class FirstDetailFragment extends BaseBackFragment { 22 | private static final String ARG_ITEM = "arg_item"; 23 | 24 | private Article mArticle; 25 | 26 | private Toolbar mToolbar; 27 | private ImageView mImgDetail; 28 | private TextView mTvTitle; 29 | private FloatingActionButton mFab; 30 | 31 | public static FirstDetailFragment newInstance(Article article) { 32 | 33 | Bundle args = new Bundle(); 34 | args.putParcelable(ARG_ITEM, article); 35 | FirstDetailFragment fragment = new FirstDetailFragment(); 36 | fragment.setArguments(args); 37 | return fragment; 38 | } 39 | 40 | @Override 41 | public void onCreate(@Nullable Bundle savedInstanceState) { 42 | super.onCreate(savedInstanceState); 43 | mArticle = getArguments().getParcelable(ARG_ITEM); 44 | } 45 | 46 | @Nullable 47 | @Override 48 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 49 | View view = inflater.inflate(R.layout.zhihu_fragment_first_detail, container, false); 50 | initView(view); 51 | return view; 52 | } 53 | 54 | private void initView(View view) { 55 | mToolbar = (Toolbar) view.findViewById(R.id.toolbar); 56 | mImgDetail = (ImageView) view.findViewById(R.id.img_detail); 57 | mTvTitle = (TextView) view.findViewById(R.id.tv_content); 58 | mFab = (FloatingActionButton) view.findViewById(R.id.fab); 59 | 60 | mToolbar.setTitle(""); 61 | initToolbarNav(mToolbar); 62 | mImgDetail.setImageResource(mArticle.getImgRes()); 63 | mTvTitle.setText(mArticle.getTitle()); 64 | 65 | mFab.setOnClickListener(new View.OnClickListener() { 66 | @Override 67 | public void onClick(View v) { 68 | start(CycleFragment.newInstance(1)); 69 | } 70 | }); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/fourth/ZhihuFourthFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.fourth; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import me.yokeyword.sample.R; 11 | import me.yokeyword.sample.demo_zhihu.base.BaseMainFragment; 12 | import me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.child.AvatarFragment; 13 | import me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.child.MeFragment; 14 | 15 | /** 16 | * Created by YoKeyword on 16/6/3. 17 | */ 18 | public class ZhihuFourthFragment extends BaseMainFragment { 19 | private Toolbar mToolbar; 20 | private View mView; 21 | 22 | public static ZhihuFourthFragment newInstance() { 23 | 24 | Bundle args = new Bundle(); 25 | 26 | ZhihuFourthFragment fragment = new ZhihuFourthFragment(); 27 | fragment.setArguments(args); 28 | return fragment; 29 | } 30 | 31 | @Nullable 32 | @Override 33 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 34 | mView = inflater.inflate(R.layout.zhihu_fragment_fourth, container, false); 35 | return mView; 36 | } 37 | 38 | @Override 39 | public void onLazyInitView(@Nullable Bundle savedInstanceState) { 40 | super.onLazyInitView(savedInstanceState); 41 | if (findChildFragment(AvatarFragment.class) == null) { 42 | loadFragment(); 43 | } 44 | 45 | mToolbar = (Toolbar) mView.findViewById(R.id.toolbar); 46 | mToolbar.setTitle(R.string.me); 47 | } 48 | 49 | private void loadFragment() { 50 | loadRootFragment(R.id.fl_fourth_container_upper, AvatarFragment.newInstance()); 51 | loadRootFragment(R.id.fl_fourth_container_lower, MeFragment.newInstance()); 52 | } 53 | 54 | public void onBackToFirstFragment() { 55 | _mBackToFirstListener.onBackToFirstFragment(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/fourth/child/AvatarFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.child; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.fragmentation.SupportFragment; 10 | import me.yokeyword.sample.R; 11 | 12 | /** 13 | * Created by YoKeyword on 16/6/6. 14 | */ 15 | public class AvatarFragment extends SupportFragment { 16 | 17 | public static AvatarFragment newInstance() { 18 | 19 | Bundle args = new Bundle(); 20 | 21 | AvatarFragment fragment = new AvatarFragment(); 22 | fragment.setArguments(args); 23 | return fragment; 24 | } 25 | 26 | @Nullable 27 | @Override 28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 29 | View view = inflater.inflate(R.layout.zhihu_fragment_fourth_avatar, container, false); 30 | return view; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/fourth/child/MeFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.child; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import me.yokeyword.fragmentation.SupportFragment; 11 | import me.yokeyword.sample.R; 12 | import me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.ZhihuFourthFragment; 13 | 14 | /** 15 | * Created by YoKeyword on 16/6/6. 16 | */ 17 | public class MeFragment extends SupportFragment { 18 | private TextView mTvBtnSettings; 19 | 20 | public static MeFragment newInstance() { 21 | 22 | Bundle args = new Bundle(); 23 | 24 | MeFragment fragment = new MeFragment(); 25 | fragment.setArguments(args); 26 | return fragment; 27 | } 28 | 29 | @Nullable 30 | @Override 31 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 32 | View view = inflater.inflate(R.layout.zhihu_fragment_fourth_me, container, false); 33 | initView(view); 34 | return view; 35 | } 36 | 37 | private void initView(View view) { 38 | mTvBtnSettings = (TextView) view.findViewById(R.id.tv_btn_settings); 39 | mTvBtnSettings.setOnClickListener(new View.OnClickListener() { 40 | @Override 41 | public void onClick(View v) { 42 | start(SettingsFragment.newInstance()); 43 | } 44 | }); 45 | } 46 | 47 | @Override 48 | public boolean onBackPressedSupport() { 49 | // 这里实际项目中推荐使用 EventBus接耦 50 | ((ZhihuFourthFragment)getParentFragment()).onBackToFirstFragment(); 51 | return true; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/fourth/child/SettingsFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.fourth.child; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import androidx.appcompat.widget.Toolbar; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import me.yokeyword.fragmentation.SupportFragment; 11 | import me.yokeyword.sample.R; 12 | 13 | /** 14 | * Created by YoKeyword on 16/6/6. 15 | */ 16 | public class SettingsFragment extends SupportFragment { 17 | private Toolbar mToolbar; 18 | 19 | public static SettingsFragment newInstance() { 20 | 21 | Bundle args = new Bundle(); 22 | 23 | SettingsFragment fragment = new SettingsFragment(); 24 | fragment.setArguments(args); 25 | return fragment; 26 | } 27 | 28 | @Nullable 29 | @Override 30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 31 | View view = inflater.inflate(R.layout.zhihu_fragment_fourth_settings, container, false); 32 | initView(view); 33 | return view; 34 | } 35 | 36 | private void initView(View view) { 37 | mToolbar = (Toolbar) view.findViewById(R.id.toolbarSettings); 38 | 39 | mToolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 40 | mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | _mActivity.onBackPressed(); 44 | } 45 | }); 46 | } 47 | 48 | @Override 49 | public boolean onBackPressedSupport() { 50 | pop(); 51 | return true; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/second/ZhihuSecondFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.second; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.sample.R; 10 | import me.yokeyword.sample.demo_zhihu.base.BaseMainFragment; 11 | import me.yokeyword.sample.demo_zhihu.ui.fragment.second.child.ViewPagerFragment; 12 | 13 | /** 14 | * Created by YoKeyword on 16/6/3. 15 | */ 16 | public class ZhihuSecondFragment extends BaseMainFragment { 17 | 18 | public static ZhihuSecondFragment newInstance() { 19 | 20 | Bundle args = new Bundle(); 21 | 22 | ZhihuSecondFragment fragment = new ZhihuSecondFragment(); 23 | fragment.setArguments(args); 24 | return fragment; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.zhihu_fragment_second, container, false); 31 | return view; 32 | } 33 | 34 | @Override 35 | public void onActivityCreated(@Nullable Bundle savedInstanceState) { 36 | super.onActivityCreated(savedInstanceState); 37 | if (findChildFragment(ViewPagerFragment.class) == null) { 38 | loadRootFragment(R.id.fl_second_container, ViewPagerFragment.newInstance()); 39 | } 40 | } 41 | 42 | @Override 43 | public void onLazyInitView(@Nullable Bundle savedInstanceState) { 44 | super.onLazyInitView(savedInstanceState); 45 | // 这里可以不用懒加载,因为Adapter的场景下,Adapter内的子Fragment只有在父Fragment是show状态时,才会被Attach,Create 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/second/child/ViewPagerFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.second.child; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import com.google.android.material.tabs.TabLayout; 6 | import androidx.viewpager.widget.ViewPager; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import me.yokeyword.fragmentation.SupportFragment; 12 | import me.yokeyword.sample.R; 13 | import me.yokeyword.sample.demo_zhihu.adapter.ZhihuPagerFragmentAdapter; 14 | 15 | /** 16 | * Created by YoKeyword on 16/6/5. 17 | */ 18 | public class ViewPagerFragment extends SupportFragment { 19 | private TabLayout mTab; 20 | private ViewPager mViewPager; 21 | 22 | public static ViewPagerFragment newInstance() { 23 | 24 | Bundle args = new Bundle(); 25 | 26 | ViewPagerFragment fragment = new ViewPagerFragment(); 27 | fragment.setArguments(args); 28 | return fragment; 29 | } 30 | 31 | @Nullable 32 | @Override 33 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 34 | View view = inflater.inflate(R.layout.zhihu_fragment_second_pager, container, false); 35 | initView(view); 36 | return view; 37 | } 38 | 39 | private void initView(View view) { 40 | mTab = (TabLayout) view.findViewById(R.id.tab); 41 | mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 42 | 43 | mTab.addTab(mTab.newTab()); 44 | mTab.addTab(mTab.newTab()); 45 | mTab.addTab(mTab.newTab()); 46 | 47 | mViewPager.setAdapter(new ZhihuPagerFragmentAdapter(getChildFragmentManager(), 48 | getString(R.string.recommend), getString(R.string.hot), getString(R.string.favorite), 49 | getString(R.string.more))); 50 | mTab.setupWithViewPager(mViewPager); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/second/child/childpager/OtherPagerFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.second.child.childpager; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import me.yokeyword.fragmentation.SupportFragment; 11 | import me.yokeyword.sample.R; 12 | 13 | /** 14 | * Created by YoKeyword on 16/6/5. 15 | */ 16 | public class OtherPagerFragment extends SupportFragment { 17 | private static final String ARG_TYPE = "arg_type"; 18 | 19 | private String mTitle; 20 | 21 | public static OtherPagerFragment newInstance(String title) { 22 | 23 | Bundle args = new Bundle(); 24 | args.putString(ARG_TYPE, title); 25 | OtherPagerFragment fragment = new OtherPagerFragment(); 26 | fragment.setArguments(args); 27 | return fragment; 28 | } 29 | 30 | @Override 31 | public void onCreate(@Nullable Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | mTitle = getArguments().getString(ARG_TYPE); 34 | } 35 | 36 | @Nullable 37 | @Override 38 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 39 | View view = inflater.inflate(R.layout.zhihu_fragment_second_pager_other, container, false); 40 | initView(view); 41 | return view; 42 | } 43 | 44 | private void initView(View view) { 45 | TextView tvTitle = (TextView) view.findViewById(R.id.tv_title); 46 | tvTitle.setText(mTitle); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/fragment/third/ZhihuThirdFragment.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.fragment.third; 2 | 3 | import android.os.Bundle; 4 | import androidx.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import me.yokeyword.sample.R; 10 | import me.yokeyword.sample.demo_zhihu.base.BaseMainFragment; 11 | import me.yokeyword.sample.demo_zhihu.ui.fragment.third.child.ShopFragment; 12 | 13 | /** 14 | * Created by YoKeyword on 16/6/3. 15 | */ 16 | public class ZhihuThirdFragment extends BaseMainFragment { 17 | 18 | public static ZhihuThirdFragment newInstance() { 19 | 20 | Bundle args = new Bundle(); 21 | 22 | ZhihuThirdFragment fragment = new ZhihuThirdFragment(); 23 | fragment.setArguments(args); 24 | return fragment; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | View view = inflater.inflate(R.layout.zhihu_fragment_third, container, false); 31 | return view; 32 | } 33 | 34 | @Override 35 | public void onLazyInitView(@Nullable Bundle savedInstanceState) { 36 | super.onLazyInitView(savedInstanceState); 37 | 38 | if (findChildFragment(ShopFragment.class) == null) { 39 | // ShopFragment是flow包里的 40 | loadRootFragment(R.id.fl_third_container, ShopFragment.newInstance()); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /demo/src/main/java/me/yokeyword/sample/demo_zhihu/ui/view/BottomBarTab.java: -------------------------------------------------------------------------------- 1 | package me.yokeyword.sample.demo_zhihu.ui.view; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.graphics.drawable.Drawable; 6 | import androidx.annotation.DrawableRes; 7 | import androidx.core.content.ContextCompat; 8 | import android.util.AttributeSet; 9 | import android.util.TypedValue; 10 | import android.view.Gravity; 11 | import android.widget.FrameLayout; 12 | import android.widget.ImageView; 13 | 14 | import me.yokeyword.sample.R; 15 | 16 | /** 17 | * Created by YoKeyword on 16/6/3. 18 | */ 19 | public class BottomBarTab extends FrameLayout { 20 | private ImageView mIcon; 21 | private Context mContext; 22 | private int mTabPosition = -1; 23 | 24 | public BottomBarTab(Context context, @DrawableRes int icon) { 25 | this(context, null, icon); 26 | } 27 | 28 | public BottomBarTab(Context context, AttributeSet attrs, int icon) { 29 | this(context, attrs, 0, icon); 30 | } 31 | 32 | public BottomBarTab(Context context, AttributeSet attrs, int defStyleAttr, int icon) { 33 | super(context, attrs, defStyleAttr); 34 | init(context, icon); 35 | } 36 | 37 | private void init(Context context, int icon) { 38 | mContext = context; 39 | TypedArray typedArray = context.obtainStyledAttributes(new int[]{R.attr.selectableItemBackgroundBorderless}); 40 | Drawable drawable = typedArray.getDrawable(0); 41 | setBackgroundDrawable(drawable); 42 | typedArray.recycle(); 43 | 44 | mIcon = new ImageView(context); 45 | int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 27, getResources().getDisplayMetrics()); 46 | LayoutParams params = new LayoutParams(size, size); 47 | params.gravity = Gravity.CENTER; 48 | mIcon.setImageResource(icon); 49 | mIcon.setLayoutParams(params); 50 | mIcon.setColorFilter(ContextCompat.getColor(context, R.color.tab_unselect)); 51 | addView(mIcon); 52 | } 53 | 54 | @Override 55 | public void setSelected(boolean selected) { 56 | super.setSelected(selected); 57 | if (selected) { 58 | mIcon.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary)); 59 | } else { 60 | mIcon.setColorFilter(ContextCompat.getColor(mContext, R.color.tab_unselect)); 61 | } 62 | } 63 | 64 | public void setTabPosition(int position) { 65 | mTabPosition = position; 66 | if (position == 0) { 67 | setSelected(true); 68 | } 69 | } 70 | 71 | public int getTabPosition() { 72 | return mTabPosition; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/bg_chat_right.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/bg_chat_right.9.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_account_circle_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_account_circle_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_account_circle_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_account_circle_white_48dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_arrow_forward_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_arrow_forward_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_discover_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_discover_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_menu_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_message_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_message_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_settings_grey_500_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_settings_grey_500_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_touch_app_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/ic_touch_app_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xhdpi/logo.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/actionbar_shadow_up.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/actionbar_shadow_up.9.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/bg_fifth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/bg_fifth.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/bg_first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/bg_first.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/bg_fourth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/bg_fourth.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/bg_second.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/bg_second.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/bg_third.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/bg_third.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_account_circle_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_account_circle_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_account_circle_white_48dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_account_circle_white_48dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_arrow_forward_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_arrow_forward_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_avatar.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_discover_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_discover_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_menu_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_settings_grey_500_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_settings_grey_500_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_touch_app_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxhdpi/ic_touch_app_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoKeyword/Fragmentation/0394930a3e2368f210df31f2632fb89b9c44e121/demo/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable/bg_msg_bubble.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 14 | 15 | 20 | 21 | 22 | 27 | 28 |