Android小知識10則(上)(2018.8重編版)

Sorrower發表於2018-03-21

Android小知識10則(下)

目錄

  • 前言
  • 橫豎屏鎖定
  • 不同解析度的圖示
  • 將字串寫在資原始檔中
  • 為AlertDialog設定點選監聽
  • ProgressDialog瞭解一下
  • 最後

前言

Android的知識還是比較碎的, 日常積累很重要. 我把平常一些小知識點整合整合, 理成了上下兩篇文章, 每篇五個知識點.


橫豎屏鎖定

有兩種方法可以實現

  • 使用配置檔案
    AndroidManifest.xmlactivity標籤下新增android:screenOrientation="portrait"即可.預設是android:screenOrientation="unspecified", 也就是根據系統當前的橫豎屏狀態切換.
  • 使用Java程式碼
    使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);是鎖定橫屏. 使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);是鎖定豎屏.

個人推薦寫在配置檔案裡面. 來兩張圖:

配置檔案
Java程式碼

不同解析度的圖示

由於Android的解析度很不統一, 小到4寸左右, 大到10寸左右. 螢幕適配是很噁心人的問題. 這裡就簡單說一下如何新增不同解析度的圖示到工程當中.
首先看一下官方的例子, 我們的目標就是讓我們的圖示按照不同解析度, 放在一個同名資料夾中.

官方例子

右擊mipmap資料夾, 在目錄中開啟, 我的是mac所以顯示finder, win/linux的話好像是檔案瀏覽器之類的名稱吧, 位置是差不多的.

右擊mipmap資料夾

然後就很簡單了, 你只需要把不同解析度的圖示, 由小到大逐一放入到mipmap-hdpimipmap-xxxhdpi中即可. 當然了, drawable也是一樣, 從drawable-hdpi到drawable-xxxhdpi.

回到Android Studio就會有想要的效果了, 用的時候只要輸入圖片名稱即可, 系統會自動選擇最合適的圖片顯示. 當然說是這麼說, 其實佈局檔案還得按照解析度來寫不是, 沒準還要區分版本(手動無奈).


將字串寫在資原始檔中

將字串寫在資原始檔中好處是不言而喻的, 便於管理, 便於查詢, 便於維護, 便於全球化等等, 而且上傳github的時候, 它也會死命提示你的(手動滑稽). 那就來看看這個知識點吧.

  • 單個字串
    單個字串的使用是非常簡單的. 將字串寫在strings.xml中, java直接引用就好. 或者用getResources().getString()方法
<string name="single_str">SingleStr</string>
TextView tvSingleStr = (TextView) findViewById(R.id.tv_single_str);
tvSingleStr.setText(R.string.single_str);
getResources().getString(R.string.app_name);
  • 字串陣列
    字串陣列的使用稍微麻煩點. 同樣在strings.xml中寫一個字串陣列. 然後在java裡面引用.
<string-array name="str_arr">
    <item>a</item>
    <item>b</item>
    <item>c</item>
    <item>d</item>
</string-array>
String[] stringArray = getResources().getStringArray(R.array.str_arr);
TextView tvStrArr = (TextView) findViewById(R.id.tv_str_arr);
tvStrArr.setText(Arrays.toString(stringArray));
  • 格式化字串
    這個格式化字串在c裡面是家常便飯, 但是到了java可能就沒那麼好使了. 總之, 也還是可以用的. 步驟還是一樣, 先strings.xml, 後java.
<string name="format_str">我買了%1$d個蘋果, 花了%2$.2f元, 抽到了%3$s去夏威夷的票, 用手比了一個%4$c</string>
String formatStr
        = String.format(getResources().getString(R.string.format_str), 5, 3.2, "兩張", `v`);
TextView tvFormatStr = (TextView) findViewById(R.id.tv_format_str);
tvFormatStr.setText(formatStr);

為AlertDialog設定點選監聽

  • 為列表和單選列表設定監聽
    關於AlertDialog的初步使用請參見之前的文章. 然後來看具體新增監聽的程式碼.
  • 列表
    直接在setItems後面新增監聽函式, 或者新建類實現監聽介面都是可以的, 要說的是, which對應點選的條目, 從0開始. 比如說點選”apple”就是0, 點選”boy”就是1.
builder.setItems(new String[]{"apple", "boy", "cat"}, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Log.i("sorrower", "which: " + which);
    }
});
  • 單選列表
    單選列表大體和列表相同, 值得一提的就是setSingleChoiceItems的第二個引數如果是-1, 就代表都不選, 如果是0, 代表預設選中第一個, 這裡的話就是”apple”.
builder.setSingleChoiceItems(new String[]{"apple", "boy", "cat"}, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Log.i("sorrower", "which: " + which);
    }
});
  • 為AlertDialog自帶按鈕設定監聽
    每個AlertDialog預設有三個按鈕的, 肯定否定和中性. 這裡不使用匿名監聽, 我們新建一個類實現監聽介面.
builder.setPositiveButton("positive", new clickListener());
builder.setNegativeButton("negative", new clickListener());
builder.setNeutralButton("neutral", new clickListener());
class clickListener implements DialogInterface.OnClickListener {
    @Override
    public void onClick(final DialogInterface dialog, int which) {
        Log.i("sorrower", "which: " + which);
    }
}

然後得到的結果和猜想的不太一樣, 點選NeutralButton, which的值是-3; 點選NegativeButton, which的值是-2; 點選PositiveButton, which的值是-1. 我們可以使用which值區分使用者點選.


ProgressDialog瞭解一下

進度條彈窗還是很實用的, 今天就帶大家瞭解一下! 先來張效果圖:

效果圖
效果圖
final ProgressDialog pd = new ProgressDialog(this);
pd.setIcon(R.mipmap.ic_launcher_round);
pd.setTitle("Dealing...");

pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 設定為矩形進度條

pd.setCancelable(false);

pd.setIndeterminate(false); // 設定進度條是否為不明確
pd.setMax(100);
pd.setProgress(0);

pd.show();

new Thread() {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(80);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            final int j = i + 1;
            pd.setProgress(j);
        }
        pd.dismiss();
    }
}.start();

如果你改一行pd.setIndeterminate(true);, 那麼就不會顯示百分比, 和處理具體數. 直接上圖:

效果圖
效果圖

如果你註釋掉pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);這一行. 那麼就是那種圓形掃描式的進度條, 你見過的. 上圖:

效果圖
效果圖

最後

還有下篇的五個知識點哦, 覺得不錯記得點贊或者關注我哦~



相關文章