接触这个小项目最初的目的是为了学习本项目中大量使用的跟网络相关的知识,随着一步步深入的发掘,发现这个项目其实对界面设计和制作的启发远比网络来的充实:
废话不多说,let’s do this!
day1:
1.项目总体使用的actionbar并不是安卓自带的,而是存在于v7包中,所以第一步要做的就是导入v7包,也是在这个项目中才知道v7包的具体位置
▸ sdk ▸ extras ▸ android ▸ support ▸ v7
引入v7包就报错了,不难发现这是因为v4包的冲突,这个问题不是第一次遇到了,大部分人使用的方法或者说最简单的方法就是删掉其他的v4包,只在项目中保留一个,这样可以解决大部分的问题,但依旧存在着一个隐患,这个问题会在下文中提到。
2.接下来使用了一个侧滑菜单,于是引入了drawlayout,这个控件在学习安卓基础的时候常常用到,也是笔者非常喜欢的,它位于v4包中
android.support.v4.widget.DrawerLayout
这里是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="com.yankee.googleplay.MainActivity" >
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white" />
<FrameLayout
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/burlywood" />
</android.support.v4.widget.DrawerLayout>
一旦运行,就会产生这样的错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yankee.googleplay/com.yankee.googleplay.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
于是为style文件手动添加了AppCompat主题,编译运行会发现还是一样的错误,原因是因为android发现了用于适配的多个values文件夹中有多个styles文件,系统默认找高版本的values文件夹,解决方法简单粗暴,删除其他适配的values文件夹就好。
3.第三就是写一些工具类,方便项目的快速开发,尤其是要经常食用的上下文Context和网络相关使用的Handler,其他的工具类我就不一一贴上代码,这里只贴出BaseApplication的代码:
public class BaseApplication extends Application {
private static BaseApplication mContext;
private static Handler mMainThreadHandler;
private static Thread mMainThread;
private static int mMainThreadId;
@Override
public void onCreate() {
// TODO Auto-generated method stub
this.mContext=this;
this.mMainThreadHandler=new Handler();
this.mMainThread=Thread.currentThread();
this.mMainThreadId=android.os.Process.myUid();
super.onCreate();
}
public static BaseApplication getApplication() {
return mContext;
}
public static Handler getMainThreadHandler() {
return mMainThreadHandler;
}
public static Thread getMainThread() {
return mMainThread;
}
public static int getMainThreadId() {
return mMainThreadId;
}
}
还有就是对activity的抽取,对于还处于菜鸟阶段的笔者来说,这是个很新的概念,可以将很繁重拖沓的activity编写抽取出来,符合java面向对象的思想。
4.项目中使用了ViewPager,所以必定需要一个adapter,但是本例中使用的是FragmentPagerAdapter,这里贴出代码:
private class MainAdapter extends FragmentPagerAdapter {
private String[] tab_names;
private BaseFragment fragment;
public MainAdapter(FragmentManager fm) {
super(fm);
tab_names = UIUtils.getStringArray(R.array.tab_names);
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
return FragmentFactory.createFragment(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return tab_names.length;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return tab_names[position];
}
}
5.这里颇有创意的是FragmentFactory类:
public class FragmentFactory {
private static final int TAB_HOME = 0;
private static final int TAB_APP = 1;
private static final int TAB_GAME = 2;
private static final int TAB_SUBJECT = 3;
private static final int TAB_RECOMMENT = 4;
private static final int TAB_CATEGORY = 5;
private static final int TAB_HOT = 6;
private static HashMap<Integer, BaseFragment> mFragments = new HashMap<Integer, BaseFragment>();
private static BaseFragment fragment;
public static BaseFragment createFragment(int position) {
// 获取到内存里面是否有fragment
fragment = mFragments.get(position);
// 说明内存没有
if (null == fragment) {
switch (position) {
case TAB_HOME:
fragment = new HomeFragment();
break;
case TAB_APP:
fragment = new AppFragment();
break;
case TAB_GAME:
fragment = new GameFragment();
break;
case TAB_SUBJECT:
fragment = new SubjectFragment();
break;
case TAB_RECOMMENT:
fragment = new RecommentFragment();
break;
case TAB_CATEGORY:
fragment = new CategoryFragment();
break;
case TAB_HOT:
fragment = new HotFragment();
break;
}
mFragments.put(position, fragment);
}
return fragment;
}
}
6.此时运行项目会发生如下的错误,表示也是第一次遇到如此奇葩的错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yankee.googleplay/com.yankee.googleplay.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.yankee.googleplay.widget.PagerTab
原因是因为application没有配,加上这么一段代码即可:
android:name="com.yankee.googleplay.application.BaseApplication"
这样一个基本的框架就搭建成功了!