控件狀態(tài)異常
當改變頂部Actionbar布局背景顏色的alpha值铺罢,以達到Actionbar不透明和全透明效果時,發(fā)現(xiàn)其它所有用到這個顏色頁面狀態(tài)都變了残炮。
//使用如下
mActionbarView.getBackground().setAlpha(255);
//mActionbarView的布局如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/titlebar_height"
android:orientation="horizontal"
android:background="@color/white"
android:baselineAligned="false">
</LinearLayout>
可以看到我們給mActionbarView設置了白色的背景色韭赘,可問題恰恰就出在這個white的背景色上。
好吧吉殃,開始解釋原因辞居。
在布局中,多個控件共用某一個資源的時候瓦灶,這些控件會共用一個狀態(tài),比如ColorState抱完。如果你改變了一個控件贼陶,其它的控件都會接收到相同的通知。所以才會出現(xiàn)上面描述的問題巧娱。
那么問題來了碉怔,有辦法解決嗎?答案是肯定的禁添。
使用mutate()方法使控件狀態(tài)不定撮胧,這樣不定狀態(tài)的控件就不會共享自己的狀態(tài)。代碼如下
mActionbarView.getBackground().mutate().setAlpha(255);
右優(yōu)先的一種布局
這是一種項目中很常用的需求老翘,需要布局自適應寬度芹啥,并且要右側的View優(yōu)先顯示完,左側的View如果一行顯示不完铺峭,則以省略號表示墓怀。
不知道有沒有描述清楚,這中布局其實很不好實現(xiàn)卫键,右側的View需要自適應寬度傀履,并且要優(yōu)先顯示完,然后才顯示左邊的View的內(nèi)容莉炉,左邊的View顯示不完了钓账,則省略號碴犬,并且左右的View是緊貼著并且自適應寬度的。大家可以想一想該怎么實現(xiàn)這種布局官扣?
好吧翅敌,如果你想不出來,我來告訴你答案吧惕蹄。
<RelativeLayout
android:id="@+id/rl_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="16dp"
android:layout_toLeftOf="@id/tv_follow"
android:layout_toRightOf="@id/avatar"
android:gravity="fill">
<TextView
android:id="@+id/tv_tag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:maxLines="1"
android:textColor="@color/black"
android:textSize="@dimen/text_size_24px" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/tv_tag"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/black"
android:textSize="@dimen/text_size_32px"
android:textStyle="bold" />
</RelativeLayout>
答案就是實用android:gravity="fill"這個屬性蚯涮,然后先顯示右側的View,再讓左側的View布局在右側View的左方即可卖陵,你會發(fā)現(xiàn)神奇的實現(xiàn)了這種布局效果遭顶。
Fragment動態(tài)切換
關于Fragment的replace方法和add方法
動態(tài)切換顯示 Activity 中的多個 Fragment 時,可以通過 replace() 實現(xiàn)泪蔫,也可以 hide() 和 show() 方法實現(xiàn)棒旗。事實上,我們更傾向于使用后者撩荣,因為 replace() 方法不會保留 Fragment 的狀態(tài)铣揉,也就是說諸如 EditText 內(nèi)容輸入等用戶操作在 remove() 時會消失。當然餐曹,如果你不想保留用戶操作的話逛拱,可以選擇前者,視情況而定台猴。
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(firstStepFragment);
if (secondStepFragment==null){
ft.add(R.id.fl_content, secondStepFragment);
}else {
ft.show(secondStepFragment);
}
ft.addToBackStack(null);
ft.commit();
通過 addToBackStack() 保存當前事務
當用戶按下返回鍵時朽合,如果回退棧中保存有之前的事務,便會執(zhí)行事務回退饱狂,而不是 finish 掉當前 Activity曹步。
這種方式用在注冊登錄涉及多個頁面的時候會非常合適
RecyclerView異常處理
這周在新建一個Activity中使用Recyclerview做一個很簡單的字符串展示的時候,出現(xiàn)了一個奇葩的異常休讳。The specified child already has a parent. You must call removeView() on the child's parent first讲婚。
然后指向項目基類重寫的一個Layout的layout方法中,百思不得騎姐俊柔,找不到哪里出錯了磺樱,因為是剛接手的項目,之前版本用到了右滑關閉頁面的一個庫作為基類婆咸,所以想到會不會跟這個有關系,但是比較其它的Activity排除了這種猜測芜辕,最終發(fā)現(xiàn)是自己犯了個小錯誤尚骄。
在RecyclerView的Adapter中,onCreateViewHolder的時候attach了parent為true導致的侵续。
when inflating you shouldn't attach the view to its parent. you wrote:
View v = inflater.inflate(R.layout.my_text_view, parent, true);
which should be :
View v = inflater.inflate(R.layout.my_text_view, parent, false);
代碼修改為如下完美運行倔丈,瞬間石化
@Override
public UserDetailViewHolder onCreateDataItemViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user_detail,
parent, false);
UserDetailViewHolder userDetailViewHolder = new UserDetailViewHolder(view);
return userDetailViewHolder;
}