將autolayout引入
dependencies { compile 也可以直接dependencies { compile 'com.zhy:autolayout:1.4.5'}Eclipse建議使用As,方便版本更新。實在不行,只有復制粘貼源碼了。
用法
第一步:
在你的項目的AndroidManifest中注明你的
設計稿
的尺寸。<meta-data android:name="design_width" android:value="768"></meta-data><meta-data android:name="design_height" android:value="1280"></meta-data>第二步:
讓你的Activity繼承自
AutoLayoutActivity
.非常簡單的兩個步驟,你就可以開始愉快的編寫布局了,詳細可以參考sample。
其他用法
如果你不希望繼承
LinearLayout -> AutoLinearLayoutRelativeLayout -> AutoRelativeLayoutFrameLayout -> AutoFrameLayoutAutoLayoutActivity
,可以在編寫布局文件時,將這樣也可以完成適配。
目前支持屬性
layout_widthlayout_heightlayout_margin(left,top,right,bottom)pading(left,top,right,bottom)textSizemaxWidth, minWidth, maxHeight, minHeight配置
默認使用的高度是設備的可用高度,也就是不包括狀態欄和底部的操作欄的,如果你希望拿設備的物理高度進行百分比化:
可以在application的onCreate方法中進行設置:
public class UseDeviceSizeApplication extends Application{ @Override public void onCreate() { super.onCreate(); AutoLayoutConifg.getInstance().useDeviceSize(); }}預覽
大家都知道,寫布局文件的時候,不能實時的去預覽效果,那么體驗真的是非常的不好,也在很大程度上降低開發效率,所以下面教大家如何用好,用對PreView(針對該庫)。
首先,你要記得你設計稿的尺寸,比如
768 * 1280
然后在你的PreView面板,選擇于設計圖分辨率一致的設備:
然后你就可以看到
最為精確的
預覽了:
兩個注意事項:
你們UI給的設計圖的尺寸并非是主流的設計圖,該尺寸沒找到,你可以自己去新建一個設備。不要在PreView中去查看所有分辨率下的顯示,是看不出來適配效果的,因為有些計算是動態的。擴展
對于其他繼承系統的FrameLayout、LinearLayout、RelativeLayout的控件,比如
package com.zhy.sample.view;import android.content.Context;import android.support.v7.widget.CardView;import android.util.AttributeSet;import com.zhy.autolayout.AutoFrameLayout;import com.zhy.autolayout.utils.AutoLayoutHelper;/** * Created by zhy on 15/12/8. */public class AutoCardView extends CardView{ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this); public AutoCardView(Context context) { super(context); } public AutoCardView(Context context, AttributeSet attrs) { super(context, attrs); } public AutoCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { return new AutoFrameLayout.LayoutParams(getContext(), attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!isInEditMode()) { mHelper.adjustChildren(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); }}CardView
,如果希望再其內部直接支持"px"百分比化,可以自己擴展,擴展方式為下面的代碼,也可參考issue#21:注意事項
ListView、RecyclerView類的Item的適配
sample中包含ListView、RecyclerView例子,具體查看sample
對于ListView對于ListView這類控件的item,默認根局部寫“px”進行適配是無效的,因為外層非AutoXXXLayout,而是ListView。但是,不用怕,一行代碼就可以支持了:
@Overridepublic View getView(int position, View convertView, ViewGroup parent){ ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); convertView.setTag(holder); //對于listview,注意添加這一行,即可在item上使用高度 AutoUtils.autoSize(convertView); } else { holder = (ViewHolder) convertView.getTag(); } return convertView;}注意
對于RecyclerViewAutoUtils.autoSize(convertView);
這行代碼的位置即可。demo中也有相關實例。public ViewHolder(View itemView){ super(itemView); AutoUtils.autoSize(itemView);}//...@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, parent, false); return new ViewHolder(convertView);}一定要記得
LayoutInflater.from(mContext).inflate
使用三個參數的方法!指定設置的值參考寬度或者高度
由于該庫的特點,布局文件中寬高上的1px是不相等的,于是如果需要寬高保持一致的情況,布局中使用屬性:
app:layout_auto_basewidth="height"
,代表height上編寫的像素值參考寬度。
app:layout_auto_baseheight="width"
,代表width上編寫的像素值參考高度。如果需要指定多個值參考寬度即:
app:layout_auto_basewidth="height|padding"
用|隔開,類似gravity的用法,取值為:
width,heightmargin,marginLeft,marginTop,marginRight,marginBottompadding,paddingLeft,paddingTop,paddingRight,paddingBottomtextSize.TextView的高度問題
設計稿一般只會標識一個進行依賴使用,如果一定要以module引用,參考該issue#74
(2)RadioGroup,Toolbar等控件中的子View無法完成適配
這個其實上文已經提到過了,需要自己擴展。不過這個很多使用者貢獻了他們的擴展類可以直接使用,參考autolayout-widget,如果沒有發現你需要的容器類,那么你就真的需要自行擴展了,當然如果你完成了擴展,可以給我發個PR,或者讓我知道,我可以加入到
autolayout-widget
中方便他人,ps:需要用到哪個copy就好了,不要直接引用autolayout-widget
,因為其引用了大量的庫,可能很多庫你是用不到的。(3)java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
這個問題是因為默認AutoLayoutActivity會繼承自AppCompatActivity,所以默認需要設置Theme.AppCompat的theme;
如果你使用的依舊是FragmentActivity等,且不考慮使用AppCompatActivity,你可以選擇自己編寫一個
MyAutoLayoutActivity extends 目前你使用的Activity基類
,例如MyAutoLayoutActivity extends FragmentActivity
,然后將該庫中AutoLayoutActivity中的邏輯拷貝進去即可,以后你就繼承你的MyAutoLayoutActivity
就好了。ps:還是建議盡快更新SDK版本使用
AppCompatActivity
.
新聞熱點
疑難解答