191.m1-Fragment页面优化,继承BaseFragment
来源:互联网 发布:兴业银行淘宝网银支付 编辑:程序博客网 时间:2024/05/22 05:18
之前将Fragment页面的加载都写在HomeFrament中,现在进行优化,页面的显示和数据的加载都统一初始化,创建2个abstract方法,一个是加载数据的返回值,一个是显示加载成功的界面,这两个都需要单独写
BaseFragment.java
package com.ldw.market.fragment;import com.ldw.market.R;import com.ldw.market.utils.ViewUtils;import android.os.Bundle;import android.os.SystemClock;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.FrameLayout;import android.widget.FrameLayout.LayoutParams;public abstract class BaseFragment extends Fragment {//初始化页面加载的5种状态public static final int STATE_UNKOWN = 0;public static final int STATE_LOADING = 1;public static final int STATE_ERROR = 2;public static final int STATE_EMPTY = 3;public static final int STATE_SUCCESS = 4;public int state = STATE_UNKOWN;private View loadingView;// 加载中的界面private View errorView;// 错误界面private View emptyView;// 空界面private View successView;// 加载成功的界面private FrameLayout frameLayout;//创建一个View对象@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if(frameLayout == null){frameLayout = new FrameLayout(getActivity());init(); // 在FrameLayout中 添加4种不同的界面:加载中, 加载错误,加载为空 ,加载成功}else{ViewUtils.removeParent(frameLayout);}//show();// 根据服务器的数据 切换状态return frameLayout;}// 在FrameLayout中 添加4种不同的界面:加载中, 加载错误,加载为空 ,加载成功private void init() {// 创建了加载中的界面loadingView = createLoadingView(); if (loadingView != null) {frameLayout.addView(loadingView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}// 加载错误界面errorView = createErrorView(); if (errorView != null) {frameLayout.addView(errorView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}// 加载空的界面emptyView = createEmptyView(); if (emptyView != null) {frameLayout.addView(emptyView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}// 根据不同的状态显示不同的界面showPage();}//根据不同的状态显示不同的界面private void showPage(){//利用||,显示加载界面if (loadingView != null) {loadingView.setVisibility(state == STATE_UNKOWN|| state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);}//利用||,显示错误界面if (errorView != null) {errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE: View.INVISIBLE);}//利用||,显示空界面if (emptyView != null) {emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE: View.INVISIBLE);}if (state == STATE_SUCCESS) {//创建成功的时候加载成功页面successView = createSuccessView();if (successView != null) {frameLayout.addView(successView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));successView.setVisibility(View.VISIBLE);}}else{//不成功的时候让页面隐藏if(successView != null){successView.setVisibility(View.INVISIBLE);}}}//加载成功的界面public abstract View createSuccessView();/* 创建加载中的界面 */private View createErrorView() {View view = View.inflate(getActivity(), R.layout.loadpage_error, null);//点击按钮重新请求服务器更新界面Button page_bt = (Button) view.findViewById(R.id.page_bt);page_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {show();}});return view;}/* 加载错误界面 */private View createEmptyView() {View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);return view;}/* 加载空的界面 */private View createLoadingView() {View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);return view;}//更具服务器获取的状态显示界面public void show() {//更新状态,当加载错误以后或者加载了空页面时候需要更新一下状态if (state == STATE_ERROR || state == STATE_EMPTY) {state = STATE_LOADING;}// 请求服务器 获取服务器上数据 进行判断// 请求服务器 返回一个结果//子线程中请求服务器,同时休眠一下new Thread() {public void run() {//休眠2sSystemClock.sleep(2000);final LoadResult result = load();if (getActivity() != null) {//主线程刷新界面getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {if(result != null){//更新状态state = result.getValue();//更新界面showPage();}}});}};}.start();showPage();}//服务器返回的数据protected abstract LoadResult load();//服务器返回的枚举结果,来显示界面public enum LoadResult{error(2), empty(3), success(4);int value;//获取服务器返回的结果LoadResult(int value) {this.value = value;}//获取到valuepublic int getValue() {return value;}}}HomeFragment.java
package com.ldw.market.fragment;import com.ldw.market.R;import com.ldw.market.fragment.BaseFragment.LoadResult;import com.ldw.market.utils.ViewUtils;import android.os.Bundle;import android.os.SystemClock;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.FrameLayout;import android.widget.FrameLayout.LayoutParams;import android.widget.TextView;/* * Home页面,主体的加载的几个页面和服务器请求数据都是在BaseFragment中去实现 */public class HomeFragment extends BaseFragment {// 当Fragment挂载的activity创建的时候调用@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);show();}public View createSuccessView() {TextView tv = new TextView(getActivity());tv.setText("加载成功了....");tv.setTextSize(30);return tv;}@Overridepublic LoadResult load() {// TODO Auto-generated method stubreturn LoadResult.success;}}
MainActivity.java
package com.ldw.market;import com.ldw.market.fragment.AppFragment;import com.ldw.market.fragment.BaseFragment;import com.ldw.market.fragment.FragmentFactory;import com.ldw.market.fragment.HomeFragment;import com.ldw.market.utils.UiUtils;import junit.framework.AssertionFailedError;import android.annotation.SuppressLint;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.ActionBarDrawerToggle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import android.support.v4.app.FragmentTransaction;import android.support.v4.view.PagerTabStrip;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.support.v4.widget.DrawerLayout;import android.support.v7.app.ActionBar;import android.support.v7.app.ActionBar.Tab;import android.support.v7.app.ActionBar.TabListener;import android.support.v7.app.ActionBarActivity;import android.support.v7.widget.SearchView;import android.support.v7.widget.SearchView.OnQueryTextListener;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Toast;public class MainActivity extends BaseActivity implements OnQueryTextListener{private DrawerLayout mDrawerLayout;private ActionBarDrawerToggle drawerToggle;private ViewPager mViewPager;private PagerTabStrip pager_tab_strip;private String[] tab_names; // 标签的名字 //加载字符串数组,初始化Tab@Overrideprotected void init() {tab_names = UiUtils.getStringArray(R.array.tab_names);} //初始化ActionBar@Override protected void initActionBar() { //添加tab标签名 ActionBar actionBar = getSupportActionBar(); //让拉出显示详情的图片显示,可以拉出详情actionBar.setDisplayHomeAsUpEnabled(true);//让按键点击有效actionBar.setHomeButtonEnabled(true);//ActionBarDrawerToggle是ActionBar控制抽屉,//参数1:当前actionBar的Activity,参数2:控制的抽屉,参数3:按钮的图片,参数4和5是描述drawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer,R.string.close_drawer){@Overridepublic void onDrawerClosed(View drawerView) {super.onDrawerClosed(drawerView);Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();}@Overridepublic void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();}};//设置监听DrawerListenermDrawerLayout.setDrawerListener(drawerToggle);// 让开关和actionbar建立关系 drawerToggle.syncState();} //初始化界面@Override protected void initView(){ setContentView(R.layout.activity_main); mDrawerLayout = (DrawerLayout) findViewById(R.id.dl); mViewPager=(ViewPager) findViewById(R.id.vp); pager_tab_strip = (PagerTabStrip) findViewById(R.id.pager_tab_strip); // 设置标签下划线的颜色 pager_tab_strip.setTabIndicatorColor(getResources().getColor(R.color.indicatorcolor)); mViewPager.setAdapter(new MainAdapter(getSupportFragmentManager())); //监听ViewPager,tab改变的时候改变界面 mViewPager.setOnPageChangeListener(new OnPageChangeListener(){@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}//条目被选中的时候,更新服务器状态,重新显示界面@Overridepublic void onPageSelected(int position) {BaseFragment createFragment = FragmentFactory.createFragment(position);createFragment.show();} }); } //可以继承PageAapter实现ViePager翻页现在继承FragmentStatePagerAdapter可以实现fragement private class MainAdapter extends FragmentStatePagerAdapter{public MainAdapter(FragmentManager fm) {super(fm);// TODO Auto-generated constructor stub}//每一个条目返回的fragment@Overridepublic Fragment getItem(int position) {// 通过Fragment工厂 生产Fragment return FragmentFactory.createFragment(position);}//条目的总数@Overridepublic int getCount() {// TODO Auto-generated method stubreturn tab_names.length;}// 返回每个条目的标题,设置tab的标签@Overridepublic CharSequence getPageTitle(int position) {return tab_names[position];} } //初始化ActionBar的界面 @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); // 如果运行的环境 (部署到什么版本的手机 )大于3.0,低版本的不支持 if (android.os.Build.VERSION.SDK_INT > 11) { SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();searchView.setOnQueryTextListener(this);// 搜索的监听 } return true; } public void click(View v){ Intent intent = new Intent(getApplicationContext(), DetailActivity.class); startActivity(intent); } /** 处理actionBar菜单条目的点击事件 */ @Overridepublic boolean onOptionsItemSelected(MenuItem item) {System.out.println("所有");//当前点击的条目是searchif (item.getItemId() == R.id.action_search) {Toast.makeText(getApplicationContext(), "搜索", 0).show();}//优先处理drawerToggle的点击,drawerToggle出不不了交给父类return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);}// 当搜索提交的时候@Overridepublic boolean onQueryTextChange(String arg0) {Toast.makeText(getApplicationContext(), arg0, 0).show();return false;}// 当搜索的文本发生变化@Overridepublic boolean onQueryTextSubmit(String arg0) {Toast.makeText(getApplicationContext(), arg0, 0).show();return false;} }
阅读全文
0 0
- 191.m1-Fragment页面优化,继承BaseFragment
- Fragment重复使用跳转可以自己写一个BaseFragment继承Fragment
- 189.m1-Fragment工厂优化Fragment的加载
- android 控件 fragment baseFragment
- 项目优化-BaseActivity和BaseFragment
- BaseFragment
- BaseFragment
- MyEclipse 8.5 M1 优化
- 190.m1-Fragment显示界面
- Android 优化Fragment防止页面多次inflate
- 199.m1-ListView的优化
- 208.m1-ViewPager的优化
- Android 6.0 运行时权限 fragment的简单封装 basefragment
- m1
- m1
- m1
- M1
- M1
- Leetcode Week15
- 2017 山理校赛 线段树单点更新+状压
- dp与px转换工具类
- Cookie学习总结
- Android 进阶13:几种进程通信方式的对比总结
- 191.m1-Fragment页面优化,继承BaseFragment
- 回环变位(2017校招一模-----循环单词)
- 135. Candy
- Android StudioDebug调试详细大全
- 50多条实用mysql数据库优化建议
- 1.2 多个线程多个锁
- 377. Combination Sum IV | Leetcode Dynamic Programming
- leetcode 44. Wildcard Matching
- 限时独占2个月:曝OPPO R11前期独家使用骁龙660