前言:

通常我们有时候会直接使用ADT工具直接新建一个Activity页,而这个Activity我们又无法更改它的父类,那遇到这种情况该如何处理呢?其实很简单,好,看如何来解决这个问题:

先来看看这个问题出现的情况,我们以SettingsActivity举例:

上图是SettingActivity的继承关系,在PreferenceActivity的内部被引用了一些internal包内的文件,普通情况下我们是无法访问这些文件的,所以我们不能通过复制ListActivity、PreferenceActivity中源代码的方式来为ListActivity更改它的父类(这里我为什么要说更改父类呢,在一般情况下,我们的项目中是有一个通用的ActionBarActivity的,通过继承它便可以自动添加ActionBar到Activity中),所以这样情况下我们就需要在SettingActivity的布局与根布局中间嵌套一层ViewGroup了,就像下面这样:

这个图可能有些丑,我来描述一下是什么情况:

我们通常在Activity中使用setContentView方法会将我们的布局文件添加到mContentRoot这个ViewGroup中去,现在呢,我们想办法把在原来的自定义布局与mContentRoot中见嵌套一个线性布局,并且线性布局中间包含我们的自定义ActionBar,这样就可以实现我们的添加ActionBar的功能。

下面看一下自动生成的与我们处理之后的效果:

左边是我通过ADT工具直接生成的SettingsActivity界面,由于我的Application设置的主题是没有ActionBar的,所以,这里没有显示系统提供的ActionBar,我想大家都明白的。

右边这张图就是我们实现之后的效果,是不是挺赞的,来看看是如何实现的:

我们在SettingsActivity中实现了如下代码:

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setupActionBar();}/*** Set up the {@link android.app.ActionBar}, if the API is available.*/@TargetApi(Build.VERSION_CODES.HONEYCOMB)private void setupActionBar() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {// Show the Up button in the action bar.try {Field mContentParentField = getWindow().getClass().getDeclaredField("mContentParent");mContentParentField.setAccessible(true);Object mContentParent = mContentParentField.get(getWindow());if (mContentParent instanceof ViewGroup) {LinearLayout ll = new LinearLayout(this);ll.setOrientation(LinearLayout.VERTICAL);ll.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));LayoutInflater.from(this).inflate(R.layout.custom_action_bar_layout, ll);ViewGroup temp = (ViewGroup) mContentParent;int childCount = temp.getChildCount();for (int i = 0; i < childCount; i++) {View view = temp.getChildAt(i);temp.removeView(view);ll.addView(view);}setContentView(ll);}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();}}}

这里的意思就是把mContentParent中的内容遍历出来,然后添加到新的容器ll当中,当然在ll创建之后就添加了自定义ActionBar,最后再通过setContentView方法将我们新布局设置进去就可以了,快来试试吧。

有疑问或者看不懂、看不明白的请留言。

Android如何给无法更改继承关系的Activity更换ActionBar(setContentView方法实战)相关推荐

  1. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  2. android 中组件继承关系图,一目了然

    View继承关系图 Adapter适配器继承关系图 Activity继承关系图

  3. java集合类继承关系图_java集合继承关系图

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基 ...

  4. php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...

    类的继承 简单理解: 某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息. 基本概念 ...

  5. Android Studio 使用笔记:查看类结构和继承关系

    选中类 ,按下F4,可以打开类的源代码 在 Eclipse 中我们可以使用 Ctrl + O 组合热键查看类的结构,Android Studio 中也可以做到. View -> Tool Win ...

  6. android context继承关系,android中Context深入详解

    以下分别通过Context认知角度,继承关系,对象创建等方面android中Context做了深入的解释,一起学习下. 1.Context认知. Context译为场景,一个应用程序可以认为是一个工作 ...

  7. Android控件的继承关系图

    Android中所有控件都继承自android.view.View,其中android.view.ViewGroup是View的一个重要子类,绝大部分的布局都继承自ViewGroup. 下面是安卓控件 ...

  8. android studio 继承关系 快捷键,Android Studio快捷键

    快捷键,加粗的是经常会使用的描述 Ctrl+E打开最近操作的文件 Ctrl+Z撤销 Ctrl+Shift+Z重做(在Eclipse中使用的是Ctrl+Y) Ctr+Y删除该行(Eclipse中的删除该 ...

  9. android context继承关系,Android - 认识Context

    app开发中,我们需要使用app的资源,比如文字.图片,Activity.Service或者broadcastReceiver等等.时常也会用到getApplicationContext()来获取一个 ...

最新文章

  1. 从零开始撸音乐播放器(源码可下载)
  2. python3 List 中的字符串合并
  3. 被误解的MVC和被神化的MVVM
  4. VS 团队资源管理 强制解锁锁定文件
  5. 错误记录(八)could not initialize proxy - no Session
  6. grafana计算不同时间的差值_大数据时代!如何基于Spark Streaming构建实时计算平台...
  7. linux编译安装mysql的意思,linux编译模式安装mysql 步骤说明
  8. Python-print学习
  9. Safari 安装 Tampermonkey(油猴)插件
  10. RTX用户帮助中心群:177262328
  11. 苹果6s照相快门声音设置_苹果手机配件常见故障及维修注意事项
  12. Windows 10的最新版本是什么?
  13. 常用类库之Math类
  14. java项目word转换成pdf并且去除水印
  15. Java+Jsp+MySql实现图书管理系统_图书管理系统代码
  16. Python计算机视觉编程第一章 基本的图像操作与处理
  17. echarts3.7.1 用例体验地图
  18. 基于HI600的低成本最小RTK系统详细搭建过程
  19. 中国高速铁路信号系统发展与思考
  20. Java、JSP学生寝室管理系统的设计与实现

热门文章

  1. 我那个37岁的大神朋友,后续
  2. C语言数组越界导致无限循环
  3. WritePrivateProfileString等读写.ini配置文件
  4. unity获取电磁笔压感_【WPF】获取电磁笔的压感
  5. 高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...
  6. RuntimeError: Can‘t call numpy() on Variable that requires grad. Use var.detach().numpy()
  7. php l方法,ThinkPHP的L方法使用简介
  8. 论文阅读 - Jukebox: A Generative Model for Music
  9. LeetCode 2180. 统计各位数字之和为偶数的整数个数
  10. python 上下文管理器、 else 块、@contextmanager