自從開學以來遇西,有一段時間沒有更新博客了疟丙,所以這兩天打算把一些東西重拾一下然后做一下總結(jié)涌矢。
PopupWindow
這是一個一旦使用就會喜歡上的一個控件雪猪,使用官方的話先來介紹一下這個東西膨更,他是一個彈出窗口“該類可以用于顯示任意視圖的彈出窗口厨喂。彈出窗口是一個浮動容器贷笛,顯示在當前活動頂部”靶庙,但是這個控件相對于dialog的好處是可以自定義其中的內(nèi)容叮叹,沒有標題艾栋,不是給其他布局添加蒙層效果,而且它默認不會響應(yīng)返回鍵蛉顽,最重要的是可以自定義他的位置蝗砾,而且十分的靈活。
先給出:官方文檔
首先需要創(chuàng)建
//參數(shù)列表有多種携冤,可以傳入自定義的contentView悼粮,設(shè)置寬高,是否可點擊等
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop,null);
PopupWindwo popWnd = PopupWindow (context);
popWnd.setContentView(contentView);
popWnd.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popWnd.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)曾棕;
設(shè)置顯示的方法
//顯示窗口(相對于參照物控件扣猫,下方自定義位置,xy分貝表兩軸的偏移量)
showAsDropDown(View anchor,int xoff,int yoff)
//顯示在正下方
showAsDropDown(View anchor)
//相對于參照物的位置
showAtLocation(View parent, int gravity, int x, int )
常用的公用方法
.dismiss()//關(guān)閉彈窗
.setFocusable()//設(shè)置是否可以獲取焦點
.setTouchable()//是否可以點擊
.setContentView()//設(shè)置內(nèi)容
....
還有一些獲取寬高翘地,更新視圖的一些方法可以參照官方文檔申尤。
這兩天發(fā)現(xiàn)一個比較好用的開源控件,設(shè)置起來更是十分方便衙耕。
結(jié)合RecyclerView的使用
由于項目需要在一個Recyclerview列表中實現(xiàn)一個類似qq聊天長按刪除的一個效果昧穿,并且有一些總結(jié)。
//聲明接口臭杰,接口方式耦合度低
/**item上控件點擊監(jiān)聽*/
public interface ItemEditTextClickListener{
void onWordListEdtClick(int position);
}
適配器中
//聲明接口
private ItemEditTextClickListener mEditTextClickListener;
//onbindViewHolder中綁定監(jiān)聽事件
//詢問線索情況氣泡彈出的點擊事件
holder.wcEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEditTextClickListener.onWordListEdtClick(position);
}
});
//并在適配器中提供對外的調(diào)用
/**點擊Edt監(jiān)聽對外調(diào)用*/
public void setEditTextClickListener(GameWord.ItemEditTextClickListener itemEditTextClickListener){
mEditTextClickListener=itemEditTextClickListener;
}
Activity中
private CustomPopWindow mCustomPopWindow;//本次使用的開源框架
//onCreate()中
//設(shè)置Edt的監(jiān)聽
adapter.setEditTextClickListener(this);
/**
* 點擊之后彈出popupwindow
* */
@Override
public void onWordListEdtClick(int position) {
Log.d("MakeGameActivity","On Edt click");
View contentView = LayoutInflater.from(this).inflate(R.layout.pop_menu,null);
//找到當前position對應(yīng)的item
View view=mlayoutManager.findViewByPosition(position);
//構(gòu)造popwindow
mCustomPopWindow = new CustomPopWindow.PopupWindowBuilder(this)
.setFocusable(true)
.setView(contentView)
.setOutsideTouchable(true)
.create()
.showAsDropDown(view,500,-580);
//添加彈框的點擊事件
popupClick(contentView,position);
}
/**氣泡中的item點擊事件*/
private void popupClick(View contentView,final int position){
final GameWord gameWord=gameWordList.get(position);
//獲取到EditText
View layout=(View)recyclerView.getChildAt(position);
final AutoCompleteTextView autoCompleteTextView=layout.findViewById(R.id.word_clue_edit_view);
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCustomPopWindow!=null){
mCustomPopWindow.dissmiss();
}
String showContent="";
switch (v.getId()){
case R.id.first_menu:
autoCompleteTextView.setText("1");
break;
case R.id.second_menu:
autoCompleteTextView.setText("2");
break;
case R.id.third_menu:
showContent="點擊菜單三";
break;
case R.id.forth_menu:
showContent="點擊菜單四";
break;
default:break;
} //Toast.makeText(MakeGameActivity.this,showContent,Toast.LENGTH_SHORT).show();
}
};
//為四個litm綁定監(jiān)聽
contentView.findViewById(R.id.first_menu).setOnClickListener(listener);
contentView.findViewById(R.id.second_menu).setOnClickListener(listener);
contentView.findViewById(R.id.third_menu).setOnClickListener(listener);
contentView.findViewById(R.id.forth_menu).setOnClickListener(listener);
}
最后是popupWindow的布局可以自定義設(shè)計粤咪。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorFabIcon"
android:orientation="vertical">
<LinearLayout
android:id="@+id/first_menu"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:padding="5dp"
android:src="@drawable/clues" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="40dp"
android:text="添加中文" />
</LinearLayout>
<LinearLayout
android:id="@+id/second_menu"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:padding="5dp"
android:src="@drawable/bd_ocr_light_off" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="40dp"
android:text="添加英文" />
</LinearLayout>
<LinearLayout
android:id="@+id/third_menu"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:padding="5dp"
android:src="@drawable/xiansuo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="40dp"
android:text="手動輸入" />
</LinearLayout>
<LinearLayout
android:id="@+id/forth_menu"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:padding="5dp"
android:src="@drawable/notebook" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="40dp"
android:text="取消" />
</LinearLayout>
</LinearLayout>
此外還有一線需要總結(jié)一下,那就是在外部如何獲根據(jù)position取到Recyclerview中item的子控件渴杆。思路大概就是,首先根據(jù)position獲取對應(yīng)的childview宪塔。之后通過對應(yīng)的childView根據(jù)id獲取到子控件磁奖。
//獲取到EditText
View layout=(View)recyclerView.getChildAt(position);
final AutoCompleteTextView autoCompleteTextView=layout.findViewById(R.id.word_clue_edit_view);
盡量不要給EditText添加點擊事件,因為EditText首先會獲取到焦點某筐,之后再點擊才會觸發(fā)點擊事件比搭。也就是在沒有獲取到焦點的時候雙擊才會觸發(fā)點擊事件。一些點擊之間的沖突還有待在深入研究一下南誊。還有在設(shè)計用戶交互的時候盡量不要做一些超越一般用戶認知的交互身诺。點擊事件盡量使用按鈕的形式蜜托,不要使用一些其他亂七八糟的東西,比如文本霉赡,圖片之類的橄务。
還有進一步的用戶體驗,比如在輸入完文本自用隱藏軟鍵盤穴亏,當需要編輯的時候使用代碼為用戶自動彈出軟鍵盤蜂挪。
//強制關(guān)閉鍵盤
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
//強制顯示
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(activity.getWindow().getDecorView(),InputMethodManager.SHOW_FORCED);
開學是比較忙,一些東西落下了嗓化,所以之后會繼續(xù)堅持做總結(jié)棠涮。