谷歌电子市场第1天

来源:互联网 发布:linux中cat命令详解 编辑:程序博客网 时间:2024/04/28 21:34

一.Actionbar和tabbar

1.actionbar的使用(4.0以上不用继承actionbarActivity)

①.Activity继承ActionBarActivity
android:theme="@style/Theme.AppCompat.Light" >
②.设置actionbar的menu

<menu xmlns:android="http://schemas.android.com/apk/res/android">    <!-- Search, should appear as action button    actionViewClass是搜索   showAsAction:always 表示总是显示,ifRoom:如果有空闲就显示,overlow收到下面 -->    <item        android:id="@+id/action_search"        android:icon="@drawable/ic_action_search"        android:title="@string/action_search"        android:actionViewClass="android.widget.SearchView"        android:showAsAction="ifRoom"/></menu>
③.使用actionbar 

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);MenuItem menuItem = menu.findItem(R.id.action_search);// 设置搜索SearchView searchView = (SearchView) menuItem.getActionView();searchView.setOnQueryTextListener(this);return true;}
搜索监听

// 搜索文字改变监听@Overridepublic boolean onQueryTextChange(String text) {Toast.makeText(MainActivity.this, text, 0).show();return true;}// 提交文字监听@Overridepublic boolean onQueryTextSubmit(String text) {Toast.makeText(MainActivity.this, text, 0).show();return true;}
       ④.返回按钮到MainActivity
ActionBar actionBar = getSupportActionBar();actionBar.setDisplayHomeAsUpEnabled(true);
Manifest设置

 <activity  android:name=".DetailActivity"            android:label="@string/app_detail"             android:parentActivityName="com.itheima.googleplay.MainActivity"            >             <!-- Parent activity meta-data to support 4.0 and lower -->        <meta-data            android:name="android.support.PARENT_ACTIVITY"            android:value="com.itheima.googleplay.MainActivity" />        </activity>

2.tabbar的使用

①.增加actionbar

//增加tab标签private void DefineActionBar() {ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);// 设置模式actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);Tab tab1 = actionBar.newTab().setText("我").setTabListener(new MyactionBar());actionBar.addTab(tab1);Tab tab2 = actionBar.newTab().setText("艹").setTabListener(new MyactionBar());actionBar.addTab(tab2);Tab tab3 = actionBar.newTab().setText("你").setTabListener(new MyactionBar());actionBar.addTab(tab3);}
②.actionbar的背景设置(见上一篇详细设置)

3.抽屉的使用

①.xml设置

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"     android:id="@+id/dl">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"       />    <FrameLayout android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@drawable/bg_tab"        android:layout_gravity="left">            </FrameLayout></android.support.v4.widget.DrawerLayout>

②.打开抽屉和actionbar绑定使用

//抽屉的设置drawerLayout = (DrawerLayout) findViewById(R.id.dl_left);//drawerLayout.openDrawer(Gravity.LEFT);// 默认打开/*//点击打开抽屉的按钮 这个必须和Tab一起,才会显示drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer, R.string.close_drawer);drawerToggle.syncState();//让开关和抽屉建立连接

③.抽屉打开处理

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.action_search:// Toast.makeText(MainActivity.this, "点击了", 0).show();break;default:break;}//如果是点击的DrawerToggle就让它处理,然后让别的处理return drawerToggle.onOptionsItemSelected(item)||super.onOptionsItemSelected(item);}




二.主页面框架ViewPager+Fragment的使用

1.使用ViewPager切换页面 每个页面是个Fragment

①.xml文件

 <android.support.v4.view.ViewPager        android:id="@+id/vp"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"       >        <android.support.v4.view.PagerTabStrip         android:id="@+id/pager_tab_strip"                android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_gravity="top"        android:background="#ffffff"        android:textColor="#000"        android:paddingTop="4dp"        android:paddingBottom="4dp" />                    </android.support.v4.view.ViewPager>


②设置适配器

class MyFragmentPagerAdapter extends FragmentPagerAdapter{public MyFragmentPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int position) {return FragmentFactory.createFragment(position);//使用工厂创建Fragment对象}@Overridepublic int getCount() {return tabNames.length;}
//使用的ViewPager的tab标题@Overridepublic CharSequence getPageTitle(int position) {return tabNames[position];//标题}}

③抽取BaseActivity

抽取BaseActivitypublic class BaseActivity extends ActionBarActivity {// 管理运行的所有的activitystatic List<BaseActivity> mActivities = new LinkedList<BaseActivity>();@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);synchronized (mActivities) {mActivities.add(this);}init();initView();initActionBar();}@Overrideprotected void onDestroy() {super.onDestroy();synchronized (mActivities) {mActivities.remove(this);}}public void killAll() {// 复制了一份mActivities 集合List<BaseActivity> copy;synchronized (mActivities) {copy = new LinkedList<BaseActivity>(mActivities);}for (BaseActivity activity : copy) {activity.finish();}// 杀死当前的进程android.os.Process.killProcess(android.os.Process.myPid());}protected void initActionBar() {}protected void initView() {}protected void init() {}

④设置FragmentFactory使用工厂去创建Fragment对象

/* * 对fragment对象进行缓存 */public class FragmentFactory {private static Map<Integer, BaseFragment> list = new HashMap<Integer, BaseFragment>();public static BaseFragment createFragment(int position) {BaseFragment fragment ;fragment = list.get(position);if (fragment == null) {if (position == 0) {fragment = new HomeFragment();} else if (position == 1) {fragment = new AppFragment();} else if (position == 2) {fragment = new GameFragment();} else if (position == 3) {fragment = new SubjectFragment();} else if (position == 4) {fragment = new CategoryFragment();} else if (position == 5) {fragment = new TopFragment();}if (fragment != null) {list.put(position, fragment);// 把创建好的Fragment存放到集合中缓存起来}}return fragment;}}



三.页面的搭建

 1. 四种界面: 加载中, 加载错误,加载为空 ,加载成功
 根据不同的状态去切换界面

public class HomeFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {FrameLayout frameLayout=new FrameLayout(getActivity());init();  //  在FrameLayout中 添加4种不同的界面showPage();//  根据不同的状态显示不同的界面show();// 根据服务器的数据 切换状态return frameLayout;}

2BaseFragment的设置

public abstract class BaseFragment extends Fragment {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 static int state = STATE_LOADING;private View loadingView;// 加载中的界面private View errorView;// 错误界面private View emptyView;// 空界面private View successView;// 加载成功的界面private FrameLayout frameLayout;protected BitmapUtils bitmapUtils;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {bitmapUtils = BitmapHelper.getBitmapUtils();// 复用FrameLayout对象if (frameLayout == null) {frameLayout = new FrameLayout(getActivity());init();// 添加4种界面} else {ViewUtils.removeParent(frameLayout);// 复用会导致错误,必须移除frameLayout的爹}// show(); 应该在切换页面的时候调用,默认的时候不显示页面showPage();return frameLayout;}/** 添加4种界面 */public 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));}successView = createSuccessView();if (successView != null) {frameLayout.addView(successView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}}/** 创建了空的界面 */public View createEmptyView() {View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);return view;}/** 创建了加载中的界面 */public View createLoadingView() {View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);return view;}/** 创建了错误的界面 */public 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();// 当show时。就显示正在加载}});return view;}/** 根据不同的状态显示不同的界面 */public 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 (successView != null) {successView.setVisibility(state == STATE_SUCCESS ? View.VISIBLE: View.INVISIBLE);}}/** 根据服务器返回的数据切换状态 */public void show() {// 当为错误的时候,切换需要变为正在加载if (state == STATE_ERROR || state == STATE_UNKOWN) {state = STATE_LOADING;}//使用线程池去执行线程ThreadManager.getInstance().createLongPool().execute(new Runnable() {@Overridepublic void run() {SystemClock.sleep(2000);state = LoadDataFromServer();// 转移到主线程执行uiif (getActivity() != null) {// 避免Fragment销毁,但是子线程还没停止,会空指针getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {if (state != -1) {showPage();// 显示页面}}});}}});showPage();// 显示页面}// 根据系统返回的数据返回不同的状态public int checkData(List data) {if (data == null) {// 如果为null,则返回加载错误return STATE_ERROR;} else {if (data.size() == 0) {// 如果没有数据,则返回为空return STATE_EMPTY;} else {return STATE_SUCCESS;// 否则成功}}}/** 创建了成功的界面 */protected abstract View createSuccessView();/** 获取数据从服务器,返回三种状态 */protected abstract int LoadDataFromServer();}

. 对FrmeLayout对象进行复用

// 复用FrameLayout对象if (frameLayout == null) {frameLayout = new FrameLayout(getActivity());init();// 添加4种界面} else {ViewUtils.removeParent(frameLayout);// 复用会导致错误,必须移除frameLayout的爹}

移除父容器

public class ViewUtils {public static void removeParent(View v){//  先找到爹 在通过爹去移除孩子ViewParent parent = v.getParent();//所有的控件 都有爹  爹一般情况下 就是ViewGoupif(parent instanceof ViewGroup){ViewGroup group=(ViewGroup) parent;group.removeView(v);}}}





0 0
原创粉丝点击