Android如何给无法更改继承关系的Activity更换ActionBar(setContentView方法实战)
前言:
通常我們有時候會直接使用ADT工具直接新建一個Activity頁,而這個Activity我們又無法更改它的父類,那遇到這種情況該如何處理呢?其實很簡單,好,看如何來解決這個問題:
先來看看這個問題出現(xiàn)的情況,我們以SettingsActivity舉例:
上圖是SettingActivity的繼承關系,在PreferenceActivity的內(nèi)部被引用了一些internal包內(nèi)的文件,普通情況下我們是無法訪問這些文件的,所以我們不能通過復制ListActivity、PreferenceActivity中源代碼的方式來為ListActivity更改它的父類(這里我為什么要說更改父類呢,在一般情況下,我們的項目中是有一個通用的ActionBarActivity的,通過繼承它便可以自動添加ActionBar到Activity中),所以這樣情況下我們就需要在SettingActivity的布局與根布局中間嵌套一層ViewGroup了,就像下面這樣:
這個圖可能有些丑,我來描述一下是什么情況:
我們通常在Activity中使用setContentView方法會將我們的布局文件添加到mContentRoot這個ViewGroup中去,現(xiàn)在呢,我們想辦法把在原來的自定義布局與mContentRoot中見嵌套一個線性布局,并且線性布局中間包含我們的自定義ActionBar,這樣就可以實現(xiàn)我們的添加ActionBar的功能。
下面看一下自動生成的與我們處理之后的效果:
左邊是我通過ADT工具直接生成的SettingsActivity界面,由于我的Application設置的主題是沒有ActionBar的,所以,這里沒有顯示系統(tǒng)提供的ActionBar,我想大家都明白的。
右邊這張圖就是我們實現(xiàn)之后的效果,是不是挺贊的,來看看是如何實現(xiàn)的:
我們在SettingsActivity中實現(xiàn)了如下代碼:
@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中的內(nèi)容遍歷出來,然后添加到新的容器ll當中,當然在ll創(chuàng)建之后就添加了自定義ActionBar,最后再通過setContentView方法將我們新布局設置進去就可以了,快來試試吧。
有疑問或者看不懂、看不明白的請留言。
總結(jié)
以上是生活随笔為你收集整理的Android如何给无法更改继承关系的Activity更换ActionBar(setContentView方法实战)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: 实时事理逻辑知识库(事理图谱)终身学习项