知识点
  • 俩种退出程序的方法
  • 复制集合
  • 同步的用法
  • 字符数组
  • 工厂模式,生产fatgment,解决了碎片重复创建的问题
  • 全局上下文
  • actionbar用法
  • fargmentadapter,当viewpager里是fargment的话更方便

1.抽取BaseActivity   管理所有activity 方便退出

  1. public class BaseActivity extends ActionBarActivity {
    // 管理运行的所有的activity
    public final static List<BaseActivity> mActivities = new LinkedList<BaseActivity>();//增删快
    //使用广播也可以,如果当前Activity想退出可以,sendReceiver
    // private KillAllReceiver receiver;
    // private class KillAllReceiver extends BroadcastReceiver{
    //
    // @Override
    // public void onReceive(Context context, Intent intent) {
    // finish();
    // }
    // } @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // receiver=new KillAllReceiver();
    // IntentFilter filter=new IntentFilter("com.itheima.google.killall");
    // registerReceiver(receiver, filter); //解决同步问题,不可以添加的时候删除
    synchronized (mActivities) {
    mActivities.add(this);
    }
    init();//定义几个方法子类去实现,代码不臃肿,这个是初始化view前的操作
    initView();
    initActionBar();
    }
    @Override
    protected void onDestroy() {
    super.onDestroy();
    synchronized (mActivities) {
    mActivities.remove(this);
    }
    // if(receiver!=null){
    // unregisterReceiver(receiver);
    // receiver=null;
    // }
    }
    public void killAll() {
    // 复制了一份mActivities 集合,因为不能在操作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() {
    }
    }
2.MainActivity 
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; // 标签的名字
@Override
protected void initActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
drawerToggle = new ActionBarDrawerToggle(this,
mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer,
R.string.close_drawer){
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
} };
mDrawerLayout.setDrawerListener(drawerToggle);
// 让开关和actionbar建立关系
drawerToggle.syncState(); }
@Override
protected void init() {
tab_names = UiUtils.getStringArray(R.array.tab_names);
} @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 MainAdpater(getSupportFragmentManager()));
//sendBroadcast(new Intent("com.itheima.google.killall"));
//Log.i(tag, msg)
}
private class MainAdpater extends FragmentStatePagerAdapter{
public MainAdpater(FragmentManager fm) {
super(fm);
}
// 每个条目返回的fragment
// 0
@Override
public Fragment getItem(int position) {
// 通过Fragment工厂 生产Fragment
return FragmentFactory.createFragment(position);
}
// 一共有几个条目
@Override
public int getCount() {
return tab_names.length;
}
// 返回每个条目的标题
@Override
public CharSequence getPageTitle(int position) {
return tab_names[position];
} }
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_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;
} /** 处理actionBar菜单条目的点击事件 */
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_search) {
Toast.makeText(getApplicationContext(), "搜索", 0).show();
}
return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
}
// 当搜索提交的时候
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(getApplicationContext(), query, 0).show();
return true;
}
// 当搜索的文本发生变化
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
}

  

3.UiUtils 
  1. public class UiUtils {
    /**
    * 获取到字符数组
    * @param tabNames 字符数组的id
    */
    public static String[] getStringArray(int tabNames) {
    return getResource().getStringArray(tabNames);
    }
    public static Resources getResource() {
    return BaseApplication.getApplication().getResources();
    } /** dip转换px */
    public static int dip2px(int dip) {
    final float scale = getResource().getDisplayMetrics().density;
    return (int) (dip * scale + 0.5f);
    }
    /** pxz转换dip */
    public static int px2dip(int px) {
    final float scale = getResource().getDisplayMetrics().density;
    return (int) (px / scale + 0.5f);
    }
    }
这样定义数组:string.xml里
  1. <string-array name="tab_names">
  2. <item>首页</item>
  3. <item>应用</item>
  4. <item>游戏</item>
  5. <item>专题</item>
  6. <item>分类</item>
  7. <item>排行</item>
  8. </string-array>
4.FragmentFactory
  1. public class FragmentFactory {
    private static Map<Integer, Fragment> mFragments = new HashMap<Integer, Fragment>();
    public static Fragment createFragment(int position) {
    Fragment fragment = null;
    fragment = mFragments.get(position); //在集合中取出来Fragment
    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) {
    mFragments.put(position, fragment);// 把创建好的Fragment存放到集合中缓存起来
    }
    }
    return fragment;
    }
    }

      

通过这样获取上下文
/**
* 代表当前应用程序
* @author itcast
*
*/
public class BaseApplication extends Application {
private static BaseApplication application;
@Override
public void onCreate() {
super.onCreate();
application=this; }
public static Context getApplication() {
return application;
}
}

2.抽取代码(BaseActivity)的更多相关文章

  1. 利用eclipse抽取 代码片段为方法

    选取要被抽取成方法的代码片段,右键->Refactor--->Extract Method 填写方法名称     抽取后成了这个样子:

  2. HDFS的Java客户端操作代码(HDFS的查看、创建)

    1.HDFS的put上传文件操作的java代码: package Hdfs; import java.io.FileInputStream; import java.io.FileNotFoundEx ...

  3. mybatis提取<where><if>共用代码

    mybatis项目dao层中很多sql语句都会拥有某些相同的查询条件,以<where><if test=""></if></where&g ...

  4. Android Studio在代码重构中的妙用

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  5. PyCharm自定义代码块设置方法-添加-删除【详细步骤】

    原文:https://blog.csdn.net/chichu261/article/details/82887108 在做项目的时候,有些代码会需要频繁的码.如果去已有的项目中去复制,又需要找很久. ...

  6. 圣诞节,把网站所有的js代码都压缩成圣诞树吧。

    本文分两章节,分别讲解如何使用js2image这个库生成可以运行的圣诞树代码 和 js2image的原理. github地址:https://github.com/xinyu198736/js2ima ...

  7. Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...

  8. 05、ListActivity的使用

    第一个好处:处理共同的操作,避免代码重复 假设我要写第二个界面我也是需要使用到mapView,那你都要去查找一个mapView.都要获取一个Map的一个地图. 第二个好处:代码规范(方便阅读,真实开发 ...

  9. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)

    一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr.其中它是在名字 ...

随机推荐

  1. jq 字符串去除空格

    1.去除首尾空格: var txt = $('#Txt').val().trim(); txt = txt.replace(/(^\s*)|(\s*$)/g, ""); 2.去除所 ...

  2. spring-boot的Hello World案例,最简单的spring-boot项目

    Spring Boot HelloWorld 一个功能: 浏览器发送hello请求,服务器接收请求并处理,响应Hello World字符串. 1.创建一个maven项目 2.导入依赖spring-bo ...

  3. 10.Redis分布式集群

    10.Redis分布式集群10.1 数据分布10.1.1 数据分布理论10.1.2 Redis数据分区10.1.3 集群功能限制10.2 搭建集群10.2.1 准备节点10.2.2 节点握手10.2. ...

  4. python基础之Day17

    一.包 1.包 含有--init--.py的文件夹  是模块的一种形式 本质是一个文件夹(用来存放文件,包内所有的文件都是用来被导入的) import 包 包.名字     往包的init里加名字 导 ...

  5. Eclispe 错误:找不到或无法加载加载主类

    解决办法: Project --> Clean Clean 操作会将该 project 以前的所有编译信息清空,然后默认将所有工程的所有 .java 文件都进行一次编译,这样的话就可以方便的进行 ...

  6. 电商项目-商品表(spu)、规格表(sku)设计

    之前在工作中,需要实现商品规格功能,做了很长一段时间,现在回过头来整理下设计思路. sku,spu概念: SPU = Standard Product Unit (标准化产品单元),SPU是商品信息聚 ...

  7. 2017沈阳站 Tree

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228 Tree Time Limit: 2000/1000 MS (Java/Others)    M ...

  8. 重置表单中的文件上传控件(file input)的方法

    方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...

  9. JavaScript中Object.keys用法

    Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组. var data={a:1,b:2,c:9,d:4,e:5}; console.log(data);//{a: 1, ...

  10. Stanford CS20学习笔记

    Lecture Note 2 Tensorboard P3 Data Structures P4 Math Operations P6 Data Types P7 tf native &&am ...