package io.hefuyi.zhihudaily.ui.fragment; import android.content.Context; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import java.util.List; import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; import io.hefuyi.zhihudaily.DailyApplication; import io.hefuyi.zhihudaily.R; import io.hefuyi.zhihudaily.injector.component.ApplicationComponent; import io.hefuyi.zhihudaily.injector.component.DaggerNavigationComponent; import io.hefuyi.zhihudaily.injector.component.NavigationComponent; import io.hefuyi.zhihudaily.injector.module.ActivityModule; import io.hefuyi.zhihudaily.injector.module.NavigationModule; import io.hefuyi.zhihudaily.interfaces.NavigationDrawerCallbacks; import io.hefuyi.zhihudaily.mvp.contract.NavigationContract; import io.hefuyi.zhihudaily.mvp.model.Theme; import io.hefuyi.zhihudaily.mvp.model.Themes; import io.hefuyi.zhihudaily.ui.activity.NavigationDrawerActivity; import io.hefuyi.zhihudaily.ui.adapter.NavigationDrawerAdapter; import io.hefuyi.zhihudaily.util.L; import io.hefuyi.zhihudaily.util.UIUtils; /** * A simple {@link Fragment} subclass. */ public class NavigationFragment extends Fragment implements NavigationDrawerCallbacks,NavigationContract.View{ private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; public static final String TAG = NavigationFragment.class.getSimpleName(); @Inject NavigationContract.Presenter navigationPresenter; @Bind(R.id.recyclerView) RecyclerView recyclerView; private NavigationDrawerCallbacks mCallbacks; private int mCurrentSelectedPosition = -1; private NavigationDrawerAdapter mAdapter; private List<Theme> mThemes; /*初始化相关*/ @Override public void onCreate(@Nullable Bundle savedInstanceState) { L.i(TAG, "onCreate " + this); super.onCreate(savedInstanceState); if (savedInstanceState != null) { mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); } //init adapter boolean isKitKatWithNavigation = Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && UIUtils.hasNavigationBar(getActivity()); mAdapter = new NavigationDrawerAdapter(isKitKatWithNavigation); //set callback for adapter mAdapter.setNavigationDrawerCallbacks(this); } public void injectDependences() { ApplicationComponent applicationComponent = ((DailyApplication) getActivity().getApplication()) .getApplicationComponent(); NavigationComponent navigationComponent = DaggerNavigationComponent.builder() .applicationComponent(applicationComponent) .activityModule(new ActivityModule(getActivity())) .navigationModule(new NavigationModule()) .build(); navigationComponent.inject(this); } /*初始化相关*/ /*view接口方法*/ @Override public void showThemes(final Themes themes) { Runnable runnable = new Runnable() { @Override public void run() { mThemes = themes.getOthers(); mAdapter.setThemes(mThemes); } }; getActivity().runOnUiThread(runnable); } @Override public void showError() { Runnable runnable = new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "get themes error", Toast.LENGTH_SHORT).show(); } }; getActivity().runOnUiThread(runnable); } /*view接口方法*/ /*普通逻辑*/ @Override public void onNavigationDrawerItemSelected(int position) { if (mCurrentSelectedPosition == position) { ((NavigationDrawerActivity)getActivity()).closeDrawer(); return; } ((NavigationDrawerActivity)getActivity()).closeDrawer(); mCurrentSelectedPosition = position; if (mCallbacks != null) { mCallbacks.onNavigationDrawerItemSelected(position); } } public void refreshUI() { TypedValue headerBackground = new TypedValue(); TypedValue navdrawerBackground = new TypedValue(); TypedValue navdrawerTextColor = new TypedValue(); Resources.Theme theme = getActivity().getTheme(); theme.resolveAttribute(R.attr.colorPrimaryDark, headerBackground, true); theme.resolveAttribute(R.attr.navdrawer_background, navdrawerBackground,true); theme.resolveAttribute(R.attr.navdrawer_text_color, navdrawerTextColor, true); recyclerView.setBackgroundResource(navdrawerBackground.resourceId); int childCount = recyclerView.getChildCount(); for (int childIndex = 0; childIndex < childCount; childIndex++) { int viewType = mAdapter.getItemViewType(childIndex); switch (viewType) { case NavigationDrawerAdapter.Type.TYPE_HEADER: ViewGroup header = (ViewGroup) recyclerView.getChildAt(childIndex); header.setBackgroundResource(headerBackground.resourceId); break; case NavigationDrawerAdapter.Type.TYPE_ITEM: ViewGroup item = (ViewGroup) recyclerView.getChildAt(childIndex); TextView textView = (TextView) item.findViewById(R.id.tvItemName); textView.setTextColor(navdrawerTextColor.resourceId); break; case NavigationDrawerAdapter.Type.TYPE_BOTTOM_SPACE: View childView = recyclerView.getChildAt(childIndex); childView.setBackgroundResource(navdrawerBackground.resourceId); break; } } mAdapter.notifyDataSetChanged(); } public static int getDefaultNavDrawerItem() { return 0; } public String getSectionId(int position){ return position == 0 ? null : mThemes.get(position - 1).getId(); } public String getTitle(int position){ return position == 0 ? getString(R.string.title_activity_main) : mThemes.get(position - 1).getName(); } public void selectItem(int position) { if (position == mCurrentSelectedPosition) { ((NavigationDrawerActivity)getActivity()).closeDrawer(); return; } mAdapter.selectPosition(position); } /*普通逻辑*/ /*生命周期回调*/ @Override public void onAttach(Context context) { L.i(TAG, "onAttach " + this); super.onAttach(context); injectDependences(); navigationPresenter.attachView(this); try { mCallbacks = (NavigationDrawerCallbacks) getActivity(); } catch (ClassCastException e) { throw new ClassCastException("Activity must implement NavigationDrawerCallbacks!"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_navigation, container, false); ButterKnife.bind(this, rootView); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setAdapter(mAdapter); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); navigationPresenter.refresh(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); } /*生命周期回调*/ }