Android開發之那些好用的資料結構與API(二)

YungFan發表於2017-12-13

Android開發之那些好用的資料結構與API 一文中提到了Android中一些好用的資料結構和API,這次繼續補充幾個我在專案中用到的好用的但是不是人人都知道的東東 ~~

1、android:digits

在Android開發中,經常要設定EditText為密碼顯示,但是通常要求密碼只能是 字母和數字 . _ 的組合,此時就可以用該屬性進行過濾


<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="0123456789abcdefghigklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM._" />
複製程式碼

測試效果

digits.gif

2、setKeyListener()

接著上面說,還有一種方法也可以限定EditText輸入字元,那就是給EditText設定KeyListener

et.setKeyListener(new NumberKeyListener() {

            //限制彈出的鍵盤型別
            public int getInputType() {

                return InputType.TYPE_CLASS_NUMBER;

            }

            //限定輸入的字元
            protected char[] getAcceptedChars() {

                char[] numbers = new char[]{'.', '1', '3', '5', '7', '9'};

                return numbers;

            }

        });
複製程式碼

測試效果

setKeyListener.gif

3、ListView 的 setEmptyView

該方法可以為沒有資料的ListView 設定一個提示View,常常用在ListView沒有載入到資料或載入資料失敗時提示

佈局 (需要準備一個背景透明的提示圖片)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#123456" />

    <ImageView
        android:id="@+id/empty"
        android:layout_width="match_parent "
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:src="@mipmap/nomorenomal" />

</RelativeLayout>

複製程式碼

Activity

public class MainActivity extends AppCompatActivity {

    private ListView mliListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mliListView = (ListView) findViewById(R.id.list);

        mliListView.setEmptyView(findViewById(R.id.empty));
    }

}
複製程式碼

測試效果

setEmptyView.png

注意 經過本人測試,如果ListView包含在某些下拉重新整理框架中,這樣做是沒有效果的,應該是衝突了。

4、android:duplicateParentState="true"

該屬性可以讓子View跟隨其Parent的狀態。常見的使用場景是某個按鈕特別小,為了設定點選事件,給其包裹一層Parent佈局,將點選事件寫到Parent上,如果希望被包裹按鈕的點選效果對應的Selector繼續生效的話,就可以使用它了,來個有說服力的測試案例。

準備好4個圖片,做成2個 StateListDrawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 觸控模式下單擊時的背景圖片-->
    <item android:drawable="@drawable/backp" android:state_pressed="true" />
    <!-- 預設時的背景圖片-->
    <item android:drawable="@drawable/bacn" />
</selector>


複製程式碼
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/press" android:state_pressed="true" />
    <item android:drawable="@drawable/nomal" />
</selector>

複製程式碼

佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/content"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        android:background="@drawable/selector_back">

        <Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="@drawable/selector"
            android:duplicateParentState="true" />

    </RelativeLayout>

</RelativeLayout>

複製程式碼

此時直接執行測試,只有按鈕有點選事件,直接點選按鈕

測試1.gif

給RelativeLayout新增點選事件

RelativeLayout rl = (RelativeLayout) findViewById(R.id.content);

rl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
複製程式碼

此時執行測試,按鈕和相對佈局都有點選事件,點選相對佈局,發現按鈕並沒有變化

測試2.gif

給Button新增 android:duplicateParentState="true

<Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="@drawable/selector"
            android:duplicateParentState="true" />
複製程式碼

再次執行測試,再次點選相對佈局,發現按鈕也跟著變化了

測試3.gif

相關文章