碎碎念 今年七月份本科畢業後入職一家會議平板公司,經過一個一個多月的鹹魚培訓輪崗生活,接手了幾個小任務,本次記錄一下其中一個任務:修改安卓5.0系統瀏覽器UI。剛接到任務的時候,本以為是很簡單的一個任務,從我以往淺薄的開發經驗來看,僅僅是修改UI佈局那自然是輕鬆愉快的事情,但是現實很骨感,經歷重重磨 ...
碎碎念
今年七月份本科畢業後入職一家會議平板公司,經過一個一個多月的鹹魚培訓輪崗生活,接手了幾個小任務,本次記錄一下其中一個任務:修改安卓5.0系統瀏覽器UI。剛接到任務的時候,本以為是很簡單的一個任務,從我以往淺薄的開發經驗來看,僅僅是修改UI佈局那自然是輕鬆愉快的事情,但是現實很骨感,經歷重重磨難直到今天才最終完成任務。在這裡記錄一下其中遇到的問題,這些問題有部分在百度谷歌各種博客或者Stack Overflow上都很難找到解決方案,有的部分就根本沒答案,或許是由於大牛們覺得太簡單而不屑於討論。話不多說,開始記錄。
1 ActionBar樣式修改
在style.xml中找到當前activity應用的theme,然後在theme里添加:
<item name="android:actionBarStyle">@style/ActionBarStyle</item>
然後自己定義ActionBarStyle,通常在裡面設置ActionBar背景。若要設置標題欄高度,可以直接在theme中添加:
<item name="android:actionBarSize">30dp</item>
2 PopupMenu樣式修改
(1)瀏覽器的更多按鈕是彈出一個菜單列表,預設是用PopupMenu實現。要修改PopupMenu樣式,在theme中添加:
<item name="android:popupMenuStyle">@style/popmenuStyle</item>
然後自定義popmenuStyle,通常在裡面設置背景,需要註意的是,無法在popmenuStyle中修改PopupMenu大小(也許是我沒找到),所以如果想更自由地自定義彈出菜單,需要選用PopupWindow。
(2)修改PopupMenu上的文字顏色和大小,可以在theme中添加:
<item name="android:textAppearanceSmallPopupMenu">@style/popmenuText</item>
然後自定義popmenuText,設置textSize和textColor.
(3)自定義popmenu的列表下劃線,需要在theme中添加:
<item name="android:dropDownListViewStyle">@style/popmenuDivider</item>
然後自定義popmenuDivider:
<style name="popmenuDivider">
<item name="android:paddingTop">5dp</item>
<item name="android:paddingBottom">5dp</item>
<item name="android:divider">@drawable/item_divider</item>
<item name="android:dividerHeight">0.25dp</item>
</style>
3 首選項的修改
幾乎所有應用都離不開首選項模塊的編寫,安卓給我們提供了preference讓我們能更方便快捷地完成需求。
(1)為了對preference預設的listView進行修改,例如設置下劃線,需要在代碼中獲取它。獲取preference的listView可以在繼承preferenceFragment的子類中重寫onCreateView:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=super.onCreateView(inflater,container,savedInstanceState);
ListView listView=(ListView)view.findViewById(android.R.id.list);
listView.setDivider(null);
return view;
}
(2)想要設置preference彈出視窗的大小,可以繼承需要修改的preference,然後在子類中重寫showDialog。例如需要修改listPreference的彈出視窗大小,則新建一個子類繼承listPreference,然後在子類中重寫showDialog:
@Override
protected void showDialog(Bundle state) {
super.showDialog(state);
Window window =getDialog().getWindow();
window.setBackgroundDrawableResource(R.drawable.menu_list_bg);
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.width = (int)(getDialog().getContext().getResources().getDimension(R.dimen.dialog_width));
window.setAttributes(layoutParams);
}
其中getDialog()是listPreference里提供dialog對象的函數。
(3)部分需求下不應該在preference的listView里每一項中都添加下劃線,因此不應該在代碼中直接獲取listView並且setDivider,我的方式是在xml的PreferenceScreen里再添加PreferenceScreen,並且在這個PreferenceScreen里設置layout作為下劃線,和在普通佈局中用view做下劃線同理。
結束語
以上記錄的都是搜索資料較少或者沒有的內容,也許大牛們都沒有這樣的需求,或者覺得太簡單,所以這方面的資料很少。但是這讓我經歷了很多困難,翻遍framework里的資源和代碼,才勉強完成任務。而且由於是安卓系統源碼,還無法像平時用android studio一樣隨意跳轉,只能用source insight緩慢查找。後來研究了一下如何用android studio查看和跳轉安卓源代碼,但是依然有很多限制。所以在這裡記錄遇到的困難和解決方法,下次遇到此類問題可以提高效率,也希望能幫助到和我一樣是初學者的萌新們。