项目实战:谷歌电子市场学习笔记1

本文详细记录了一次项目实践的过程,从网络相关知识的学习入手,逐步深入到界面设计与制作,展示了如何通过引入V7包解决冲突问题,运用DrawerLayout实现侧滑菜单,编写工具类提升开发效率,以及对Activity的抽取和使用ViewPager与FragmentPagerAdapter。项目中还涉及了错误处理,如应用未配置问题,并最终搭建起项目的基本框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接触这个小项目最初的目的是为了学习本项目中大量使用的跟网络相关的知识,随着一步步深入的发掘,发现这个项目其实对界面设计和制作的启发远比网络来的充实:
废话不多说,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"

这样一个基本的框架就搭建成功了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值