Android調整TimePicker和DatePicker大小


最近寫了個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就可以並列顯示了,我的顯示結果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM