├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── neu │ │ └── androidbestpractices │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── neu │ │ │ └── androidbestpractices │ │ │ ├── MyApplication.java │ │ │ ├── activity │ │ │ ├── ContactActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── QrcodeActivity.java │ │ │ └── base │ │ │ │ └── BaseActivity.java │ │ │ ├── adapter │ │ │ └── CardViewAdapter.java │ │ │ ├── fragment │ │ │ ├── ContactFragment.java │ │ │ ├── QrcodeFragment.java │ │ │ └── base │ │ │ │ └── BaseFragment.java │ │ │ ├── pojo │ │ │ └── ItemTest.java │ │ │ └── widget │ │ │ └── FixedHeightScrollingViewBehavior.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── adapter_item.xml │ │ ├── common_activity.xml │ │ ├── fragment_contact.xml │ │ └── fragment_qrcode.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── neu │ └── androidbestpractices │ └── ExampleUnitTest.java ├── build.gradle ├── contact ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── neu │ │ └── contact │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── neu │ │ └── contact │ │ ├── ContactFactory.java │ │ ├── constants │ │ └── Constants.java │ │ ├── contact │ │ ├── Contact.java │ │ ├── ContactCallback.java │ │ ├── ContactImpl.java │ │ └── PermissionResultCallback.java │ │ ├── contactui │ │ ├── ContactDetailsFragment.java │ │ ├── ContactsListFragment.java │ │ ├── ContactsPickerActivity.java │ │ └── OnContactSelectedListener.java │ │ └── util │ │ ├── PermissionUtil.java │ │ └── Utils.java │ └── res │ ├── drawable-hdpi │ ├── library_ic_action_search.png │ └── library_ic_person_add_white_48dp.png │ ├── drawable-xhdpi │ ├── library_ic_action_search.png │ └── library_ic_person_add_white_48dp.png │ ├── layout │ ├── library_activity_contacts.xml │ ├── library_fragment_contact_detail.xml │ ├── library_fragment_contacts_list.xml │ ├── library_list_item_contacts.xml │ └── library_list_item_phone_number.xml │ ├── menu │ └── library_main.xml │ └── values │ ├── library_strings.xml │ ├── library_styles.xml │ └── strings.xml ├── gradle.properties ├── gradle ├── maven_push.gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── httpclient ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── neu │ │ └── httpclient │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── neu │ │ │ └── httpclient │ │ │ ├── HttpCallback.java │ │ │ ├── HttpRequest.java │ │ │ ├── HttpRequestFactory.java │ │ │ ├── OkHttpRequestImpl.java │ │ │ ├── ProgressListener.java │ │ │ └── TType.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── neu │ └── httpclient │ └── ExampleUnitTest.java ├── qrcode ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── neu │ │ └── qrcode │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── neu │ │ │ └── qrcode │ │ │ ├── Qrcode.java │ │ │ ├── QrcodeFactory.java │ │ │ ├── callback │ │ │ ├── PermissionResultCallback.java │ │ │ └── QrcodeCallback.java │ │ │ ├── impl │ │ │ └── QrcodeImpl.java │ │ │ ├── qrcode │ │ │ └── QrcodeInfo.java │ │ │ ├── skill │ │ │ ├── activity │ │ │ │ └── CaptureActivity.java │ │ │ ├── camera │ │ │ │ ├── AutoFocusManager.java │ │ │ │ ├── CameraConfigurationManager.java │ │ │ │ ├── CameraManager.java │ │ │ │ ├── PreviewCallback.java │ │ │ │ └── open │ │ │ │ │ └── OpenCameraInterface.java │ │ │ ├── constants │ │ │ │ └── Constants.java │ │ │ ├── decode │ │ │ │ ├── DecodeFormatManager.java │ │ │ │ ├── DecodeHandler.java │ │ │ │ └── DecodeThread.java │ │ │ ├── utils │ │ │ │ ├── BeepManager.java │ │ │ │ ├── CaptureActivityHandler.java │ │ │ │ └── InactivityTimer.java │ │ │ └── view │ │ │ │ └── ViewfinderView.java │ │ │ └── util │ │ │ └── Utils.java │ └── res │ │ ├── layout │ │ ├── library_activity_capture.xml │ │ └── library_view_find_view.xml │ │ ├── raw │ │ └── beep.ogg │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── neu │ └── qrcode │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | /.idea 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # android-best-practices 2 | 3 | android最佳实践学习 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.neu.androidbestpractices" 9 | minSdkVersion 16 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.1.1' 26 | compile 'com.android.support:recyclerview-v7:23.1.1' 27 | compile 'com.android.support:cardview-v7:23.1.1' 28 | compile 'com.jakewharton:butterknife:7.0.1' 29 | compile 'com.android.support:design:23.1.1' 30 | 31 | compile project(':contact') 32 | compile project(':qrcode') 33 | compile project(':httpclient') 34 | } 35 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/neu/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/neu/androidbestpractices/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices; 2 | 3 | import android.app.Application; 4 | 5 | /** 6 | * Created by neu on 16/2/2. 7 | */ 8 | public class MyApplication extends Application{ 9 | /** 10 | * 全局实例 11 | */ 12 | private static MyApplication sApp; 13 | 14 | /** 15 | * 获取实例 16 | * @return 17 | */ 18 | public static MyApplication getInstance(){ 19 | return sApp; 20 | } 21 | @Override 22 | public void onCreate() { 23 | super.onCreate(); 24 | //初始化 25 | sApp = this; 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/activity/ContactActivity.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.activity; 2 | 3 | 4 | import android.app.Activity; 5 | import android.app.Fragment; 6 | 7 | import com.neu.androidbestpractices.activity.base.BaseActivity; 8 | import com.neu.androidbestpractices.fragment.ContactFragment; 9 | 10 | /** 11 | * 联系人界面 12 | * Created by neu on 16/2/3. 13 | */ 14 | public class ContactActivity extends BaseActivity { 15 | @Override 16 | protected Activity getActivity() { 17 | return this; 18 | } 19 | 20 | @Override 21 | protected Fragment getFragment() { 22 | return new ContactFragment(); 23 | } 24 | 25 | @Override 26 | protected CharSequence getToolbarTitle() { 27 | return "联系人测试"; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.activity; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | 9 | import com.neu.androidbestpractices.R; 10 | import com.neu.androidbestpractices.adapter.CardViewAdapter; 11 | import com.neu.androidbestpractices.pojo.ItemTest; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | /** 17 | * 首页 18 | */ 19 | public class MainActivity extends AppCompatActivity { 20 | 21 | @Override 22 | protected void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_main); 25 | 26 | RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 27 | 28 | //设置layoutmanager 29 | LinearLayoutManager llm = new LinearLayoutManager(this); 30 | recyclerView.setLayoutManager(llm); 31 | 32 | //设置adapter 33 | CardViewAdapter adapter = new CardViewAdapter(getList(), this); 34 | recyclerView.setAdapter(adapter); 35 | 36 | 37 | Activity activity = this; 38 | activity.findViewById(R.id.collapsing_toolbar); 39 | } 40 | 41 | /** 42 | * 数据 43 | * @return 44 | */ 45 | private List getList() { 46 | List list = new ArrayList<>(); 47 | list.add(new ItemTest("联系人模块",ContactActivity.class.getCanonicalName())); 48 | list.add(new ItemTest("二维码模块",QrcodeActivity.class.getCanonicalName())); 49 | 50 | return list; 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/activity/QrcodeActivity.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.activity; 2 | 3 | import android.app.Activity; 4 | import android.app.Fragment; 5 | 6 | import com.neu.androidbestpractices.activity.base.BaseActivity; 7 | import com.neu.androidbestpractices.fragment.QrcodeFragment; 8 | 9 | /** 10 | * Created by neu on 16/2/23. 11 | */ 12 | public class QrcodeActivity extends BaseActivity{ 13 | @Override 14 | protected Activity getActivity() { 15 | return this; 16 | } 17 | 18 | @Override 19 | protected Fragment getFragment() { 20 | return new QrcodeFragment(); 21 | } 22 | 23 | @Override 24 | protected CharSequence getToolbarTitle() { 25 | return "扫描二维码测试"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/activity/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.activity.base; 2 | 3 | import android.app.Activity; 4 | import android.app.Fragment; 5 | import android.os.Bundle; 6 | import android.support.design.widget.CollapsingToolbarLayout; 7 | import android.support.v7.app.ActionBar; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.support.v7.widget.Toolbar; 10 | import android.view.View; 11 | 12 | import com.neu.androidbestpractices.R; 13 | 14 | import butterknife.Bind; 15 | import butterknife.ButterKnife; 16 | 17 | /** 18 | * activity的基类 19 | * Created by neu on 16/2/3. 20 | */ 21 | public abstract class BaseActivity extends AppCompatActivity { 22 | 23 | @Bind(R.id.toolBar) 24 | Toolbar mToolBar; 25 | @Bind(R.id.collapsing_toolbar) 26 | CollapsingToolbarLayout mCollapsingToolbar; 27 | 28 | @Override 29 | public void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | 32 | View view = View.inflate(this, R.layout.common_activity, null); 33 | setContentView(view); 34 | ButterKnife.bind(this); 35 | 36 | //设置工具栏 37 | setSupportActionBar(mToolBar); 38 | 39 | ActionBar actionBar = getSupportActionBar(); 40 | if (actionBar != null){ 41 | actionBar.setDisplayHomeAsUpEnabled(true); 42 | } 43 | 44 | mCollapsingToolbar.setTitle(getToolbarTitle()); 45 | getFragmentManager().beginTransaction().replace(R.id.content_frame,getFragment()).commit(); 46 | 47 | mToolBar.setNavigationOnClickListener(new View.OnClickListener() { 48 | @Override 49 | public void onClick(View v) { 50 | getActivity().finish(); 51 | } 52 | }); 53 | 54 | } 55 | 56 | protected abstract Activity getActivity(); 57 | 58 | protected abstract Fragment getFragment(); 59 | 60 | protected abstract CharSequence getToolbarTitle(); 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/adapter/CardViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.support.v7.widget.CardView; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.TextView; 11 | 12 | import com.neu.androidbestpractices.R; 13 | import com.neu.androidbestpractices.pojo.ItemTest; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * adapter 19 | * Created by neu on 16/2/2. 20 | */ 21 | public class CardViewAdapter extends RecyclerView.Adapter{ 22 | private Context mContext; 23 | private List mList; 24 | 25 | /** 26 | * 跳转 27 | * @param position 用户点击的位置 28 | */ 29 | private void redirectToDetail(int position) { 30 | Intent intent=new Intent(); 31 | intent.setClassName(mContext,mList.get(position).className); 32 | mContext.startActivity(intent); 33 | } 34 | public CardViewAdapter(List list, Context context){ 35 | mList=list; 36 | mContext=context; 37 | } 38 | 39 | 40 | @Override 41 | public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 42 | View item= LayoutInflater.from(mContext).inflate(R.layout.adapter_item,parent,false); 43 | 44 | return new CardViewHolder(item, new CardViewHolder.ClickListener() { 45 | @Override 46 | public void onWholeClick(int position) { 47 | redirectToDetail(position); 48 | } 49 | }); 50 | } 51 | 52 | 53 | @Override 54 | public void onBindViewHolder(CardViewHolder holder, int position) { 55 | final ItemTest title=mList.get(position); 56 | holder.mTextView.setText(title.itemName); 57 | } 58 | 59 | @Override 60 | public int getItemCount() { 61 | return mList.size(); 62 | } 63 | 64 | public static class CardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 65 | private TextView mTextView; 66 | private ClickListener mClickListener; 67 | private CardView list_card_view; 68 | public CardViewHolder(View itemView,ClickListener clickListener) { 69 | super(itemView); 70 | this.mClickListener=clickListener; 71 | mTextView=(TextView)itemView.findViewById(R.id.itemText); 72 | list_card_view=(CardView)itemView.findViewById(R.id.list_card_view); 73 | list_card_view.setOnClickListener(this); 74 | } 75 | 76 | @Override 77 | public void onClick(View v) { 78 | switch (v.getId()){ 79 | case R.id.list_card_view: 80 | mClickListener.onWholeClick(getAdapterPosition()); 81 | break; 82 | default: 83 | break; 84 | } 85 | } 86 | 87 | public interface ClickListener{ 88 | void onWholeClick(int position); 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/fragment/ContactFragment.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.fragment; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.NonNull; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.TextView; 9 | 10 | import com.neu.androidbestpractices.R; 11 | import com.neu.androidbestpractices.fragment.base.BaseFragment; 12 | import com.neu.contact.ContactFactory; 13 | import com.neu.contact.contact.Contact; 14 | import com.neu.contact.contact.ContactCallback; 15 | import com.neu.contact.contact.PermissionResultCallback; 16 | 17 | import butterknife.Bind; 18 | import butterknife.OnClick; 19 | 20 | /** 21 | * Created by neu on 16/2/3. 22 | */ 23 | public class ContactFragment extends BaseFragment{ 24 | @Bind(R.id.contact) 25 | Button mContactButton; 26 | @Bind(R.id.text) 27 | TextView mText; 28 | @Bind(R.id.contactUI) 29 | Button mContactUI; 30 | @OnClick({R.id.contact,R.id.contactUI}) 31 | void testContactModule(Button button){ 32 | switch (button.getId()){ 33 | case R.id.contact: 34 | 35 | mContact.getContacts(); 36 | break; 37 | case R.id.contactUI: 38 | 39 | mContact.getContactsUI(); 40 | break; 41 | } 42 | } 43 | 44 | private Contact mContact; 45 | 46 | @Override 47 | protected int getFragmentLayout() { 48 | return R.layout.fragment_contact; 49 | } 50 | 51 | @Override 52 | public void onViewCreated(View view, Bundle savedInstanceState) { 53 | mContact = ContactFactory.newContact(this); 54 | } 55 | 56 | @Override 57 | public void onActivityResult(int requestCode, int resultCode, Intent data) { 58 | mContact.onActivityResult(requestCode, resultCode, data, new ContactCallback() { 59 | @Override 60 | public void onSuccess(@NonNull String contactNumber, @NonNull String contactName) { 61 | mText.setText(contactName + contactNumber); 62 | } 63 | 64 | @Override 65 | public void onFailed(@NonNull int errCode, @NonNull String message) { 66 | mText.setText(errCode + message); 67 | } 68 | }); 69 | 70 | } 71 | 72 | @Override 73 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 74 | mContact.onRequestPermissionsResult(requestCode, permissions, grantResults, new PermissionResultCallback() { 75 | 76 | @Override 77 | public void denyPermission() { 78 | mText.setText("用户已经拒绝"); 79 | } 80 | }); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/fragment/QrcodeFragment.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.fragment; 2 | 3 | import android.content.Intent; 4 | import android.support.annotation.NonNull; 5 | import android.widget.Button; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import com.neu.androidbestpractices.R; 10 | import com.neu.androidbestpractices.fragment.base.BaseFragment; 11 | import com.neu.qrcode.Qrcode; 12 | import com.neu.qrcode.QrcodeFactory; 13 | import com.neu.qrcode.callback.QrcodeCallback; 14 | import com.neu.qrcode.qrcode.QrcodeInfo; 15 | 16 | import butterknife.Bind; 17 | import butterknife.OnClick; 18 | 19 | /** 20 | * Created by neu on 16/2/23. 21 | */ 22 | public class QrcodeFragment extends BaseFragment { 23 | 24 | @Bind(R.id.qrCode) 25 | Button mQrCodeButton; 26 | @Bind(R.id.text) 27 | TextView mText; 28 | @Bind(R.id.image) 29 | ImageView mImageView; 30 | @OnClick(R.id.qrCode) 31 | void onClick(){ 32 | mQrcode = QrcodeFactory.newQrcode(this); 33 | mQrcode.start(); 34 | } 35 | private Qrcode mQrcode; 36 | 37 | @Override 38 | protected int getFragmentLayout() { 39 | return R.layout.fragment_qrcode; 40 | } 41 | 42 | 43 | @Override 44 | public void onActivityResult(int requestCode, int resultCode, final Intent data) { 45 | mQrcode.onActivityResult(requestCode, resultCode, data, new QrcodeCallback() { 46 | @Override 47 | public void onSuccess(@NonNull QrcodeInfo info) { 48 | String textInfo = "二维码信息" + info.getResult() + "图片高度" + info.getHeight() + "图片宽度" + info.getWidth(); 49 | mText.setText(textInfo); 50 | mImageView.setImageBitmap(info.getQrCodeImage()); 51 | } 52 | 53 | @Override 54 | public void onFailed(@NonNull String errMsg) { 55 | mText.setText(errMsg); 56 | } 57 | }); 58 | } 59 | 60 | @Override 61 | public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 62 | mQrcode.onRequestPermissionsResult(requestCode, permissions, grantResults, new com.neu.qrcode.callback.PermissionResultCallback() { 63 | @Override 64 | public void denyPermission() { 65 | mText.setText("App无权限"); 66 | } 67 | }); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/fragment/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.fragment.base; 2 | 3 | import android.app.Fragment; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import butterknife.ButterKnife; 11 | 12 | /** 13 | * Created by neu on 16/2/3. 14 | */ 15 | public abstract class BaseFragment extends Fragment{ 16 | @Nullable 17 | @Override 18 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 19 | View view = inflater.inflate(getFragmentLayout(),container,false); 20 | ButterKnife.bind(this,view); 21 | return view; 22 | } 23 | 24 | @Override 25 | public void onDestroyView() { 26 | super.onDestroyView(); 27 | ButterKnife.unbind(this); 28 | } 29 | 30 | protected abstract int getFragmentLayout(); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/pojo/ItemTest.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.pojo; 2 | 3 | /** 4 | * 每个item对应的pojo 5 | * Created by neu on 16/2/2. 6 | */ 7 | public class ItemTest { 8 | //模块名称 9 | public String itemName; 10 | //模块测试入口 11 | public String className; 12 | 13 | public ItemTest(String itemName, String className) { 14 | this.itemName = itemName; 15 | this.className = className; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/neu/androidbestpractices/widget/FixedHeightScrollingViewBehavior.java: -------------------------------------------------------------------------------- 1 | package com.neu.androidbestpractices.widget; 2 | 3 | import android.content.Context; 4 | import android.support.design.widget.AppBarLayout; 5 | import android.support.design.widget.CoordinatorLayout; 6 | import android.support.v4.view.ViewCompat; 7 | import android.util.AttributeSet; 8 | import android.view.View; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * 处理滑动问题 14 | * Created by neu on 16/2/3. 15 | */ 16 | public class FixedHeightScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { 17 | public FixedHeightScrollingViewBehavior() { 18 | } 19 | 20 | public FixedHeightScrollingViewBehavior(Context context, AttributeSet attrs) { 21 | super(context, attrs); 22 | } 23 | 24 | public boolean onMeasureChild(CoordinatorLayout parent, View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { 25 | if (child.getLayoutParams().height == -1) { 26 | List dependencies = parent.getDependencies(child); 27 | if (dependencies.isEmpty()) { 28 | return false; 29 | } 30 | 31 | AppBarLayout appBar = findFirstAppBarLayout(dependencies); 32 | if (appBar != null && ViewCompat.isLaidOut(appBar)) { 33 | if (ViewCompat.getFitsSystemWindows(appBar)) { 34 | ViewCompat.setFitsSystemWindows(child, true); 35 | } 36 | 37 | int scrollRange = appBar.getTotalScrollRange(); 38 | int height = parent.getHeight() - appBar.getMeasuredHeight() + Math.min(scrollRange, parent.getHeight() - heightUsed); 39 | int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY); 40 | parent.onMeasureChild(child, parentWidthMeasureSpec, widthUsed, heightMeasureSpec, heightUsed); 41 | return true; 42 | } 43 | } 44 | 45 | return false; 46 | } 47 | 48 | private static AppBarLayout findFirstAppBarLayout(List views) { 49 | int i = 0; 50 | 51 | for (int z = views.size(); i < z; ++i) { 52 | View view = (View) views.get(i); 53 | if (view instanceof AppBarLayout) { 54 | return (AppBarLayout) view; 55 | } 56 | } 57 | 58 | return null; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/adapter_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/common_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |