最近寫了個app,里面要將DatePicker和TimePicker並列顯示。但是,Android內部把DatePicker和 TimePicker大小固定了,導致4.5寸手機屏幕一行只能顯示出一個,另一個不能完全顯示。在網上搜了一下,沒有什么好的解決方案,看到了別人寫的 一個自定義控件,研究了下,發現了一個方法來調整兩個組件的大小。
沒有調整之前效果如圖:可以看到TimePicker只有很小一部分顯示出來了

由於TimePicker和DatePicker里面的每一個選擇框都是一個NumberPicker,而NumberPicker是可以改變LayoutParams的,所以可以有如下調整思路:
1.改變DatePicker和TimePicker里面字體的大小,目的是讓DatePicker和TimePicker縮小了以后字能夠完全顯示出來。
2.得到DatePicker和TimePicker里面的NumberPicker
3.改變取得的NumberPicker的寬度,就大功告成了
1.改變字體大小
改變字體大小有幾種方法,為了統一,我是用的主題資源來改變字體大小的,代碼如下:
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:textSize">10sp</item>
</style>
2.得到DatePicker和TimePicker里面的NumberPicker
由於DatePicker和TimePicker都繼承了FrameLayout類,所以函數可以定義為:
/**
* 調整FrameLayout大小
* @param tp
*/
private void resizePikcer(FrameLayout tp){
List<NumberPicker> npList = findNumberPicker(tp);
for(NumberPicker np:npList){
resizeNumberPicker(np);
}
}
這個函數很簡單,參數是FrameLayout,調用時傳入其子類即可。該函數調用了我自定義的findNumberPicker函數找到tp里面所有的NumberPicker,然后用自定義的resizeNumberPicker調整大小。
其中:findNumberPicker定義如下:
/**
* 得到viewGroup里面的numberpicker組件
* @param viewGroup
* @return
*/
private List<NumberPicker> findNumberPicker(ViewGroup viewGroup){
List<NumberPicker> npList = new ArrayList<NumberPicker>();
View child = null;
if(null != viewGroup){
for(int i = 0;i<viewGroup.getChildCount();i++){
child = viewGroup.getChildAt(i);
if(child instanceof NumberPicker){
npList.add((NumberPicker)child);
}
else if(child instanceof LinearLayout){
List<NumberPicker> result = findNumberPicker((ViewGroup)child);
if(result.size()>0){
return result;
}
}
}
}
return npList;
}
這個函數是遍歷viewGroup的子元素,如果是NumberPicker則加入集合中。如果是一個LinearLayout布局,遞歸調用該函數,找布局里面的NumberPicker.
resizeNumberPicker定義如下:
/*
* 調整numberpicker大小
*/
private void resizeNumberPicker(NumberPicker np){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(50, LayoutParams.WRAP_CONTENT);
params.setMargins(10, 0, 10, 0);
np.setLayoutParams(params);
}
該函數完成調整功能,也很簡單,new一個布局參數,然后設置寬度為50,高度為wrap_content,再通過setMargins設置邊距,把NumberPicker的布局參數設置為該值。
准備完這些后,就可以調用了,調用也很簡單,就是得到DatePicker和TimePicker對象,然后用resizePicker(DatePicker)和resizePicker(TimePicker)即可。
下面貼出我的調用代碼:
DatePicker datePicker = (DatePicker)rootView.findViewById(R.id.date);//日期選擇框 TimePicker timePicker = (TimePicker)rootView.findViewById(R.id.time);//時間選擇框 resizePikcer(datePicker);//調整datepicker大小 resizePikcer(timePicker);//調整timepicker大小
大功告成,所有步驟完成后,DatePicker和TimePicker就可以並列顯示了,我的顯示結果如下圖:

