【Android】Android UI 開發_問答_3

鏈接 【Android】Android UI 開發_問答_2.

對不同屏幕的支持


屏幕大小的分類有哪些?

  • small,normal,large,xlarge

密度的分類有哪些?

  • low (ldpi),medium (mdpi),high (hdpi),extra high (xhdpi)

屏幕的方向有哪些?

  • landscape,portrait 即橫向和縱向

爲什麼需要根據屏幕不同來定義不同的佈局文件?不同大小屏幕的佈局文件怎麼存放?

  • 優化用戶體驗
    屏幕不同佈局需求不同,定義不同的佈局文件後,
    系統從對應的佈局目錄中以你的app所運行的設備的屏幕大小自動調入對應的佈局文件
  • 同一目錄下,且文件名必須是一樣的,只是內容不同 (略懂)
MyProject/res/layout/main.xml
              layout-land/main.xml
              layout-large/main.xml
              layout-large-land/main.xml

爲什麼需要根據屏幕密度提供不同的 bitmap 資源?怎麼做?

  • 提高在不同屏幕密度上的圖像質量
  • ldpi 的資源並不總是必須的,
    當你提供 hdpi 的資源的時候,系統會縮放一半適應 ldpi 屏幕 (略懂)
MyProject/res/drawable-xhdpi/awesomeimage.png
              drawable-hdpi/awesomeimage.png
              drawable-mdpi/awesomeimage.png

不同密度的比例是什麼?

  • xxhdpi: 3.0
    xhdpi: 2.0
    hdpi: 1.5
    mdpi: 1.0 (baseline參照)
    ldpi: 0.75

按鈕


根據按鈕上顯示的內容,按鈕可以分爲幾種?分別用什麼屬性設置?

  • 有文本,有圖標,二者都有,共三種
  • 文本,Button,用 text 屬性設置
    圖標,ImageButton,用 src 設置
    文本 + 圖標,Button,用 text 設置文本,用 drawableXXX 設置圖標

按鈕的 onClick 屬性有什麼用?怎麼用?它的值所指定的響應方法在哪裏定義,有什麼特殊要求?方法的參數是什麼?

  • 定義一個按鈕的事件處理器
    用戶單擊按鈕時,Button 對象接收一個 單擊 事件,添加 onClick 屬性的作用就是處理這個事件
  • 添加該屬性,屬性值是對事件進行響應的 方法名
  • 在 Activity 中定義,必須是 public、返回 void
    方法參數是一個唯一的View參數

還可以怎麼設置按鈕的監聽方法?代碼模板是什麼?望大家理解該模板

Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do something in response to button click
    }
});

如何定義按鈕的樣式?

  • 設置android:backgroud屬性爲一個 drawable 或 color 資源
    也可以應用某種樣式

如何定義無邊框按鈕?

<Button style="?android:attr/borderlessButtonStyle"/>

如何定製背景?

  • 1.創建三個不同的位圖圖片,代表 default(無)、pressed(按下) 和 focused(聚焦) 這三種狀態
    2.把這些圖片放在 res/drawable/ 這個工程目錄中,圖片名應反映對應按鈕狀態
    3.在 res/drawable/ 中創建 button_custom.xml,
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_focused"
          android:state_focused="true" />
    <item android:drawable="@drawable/button_default" />
</selector>
//<item>的順序非常重要,只有當 pressed 和 focused 均爲 false 時,default 纔會應用

什麼是 ninepatch 圖片,該圖片中的四條線分別表示什麼意義?它的名字怎麼命名?相應的 xml 什麼用?裏面的子標籤什麼含義?

  • NinePatch(.9)圖片,可拉伸的位圖圖像,有 padding 的圖像文件
    左邊及上邊的線定義可伸縮區域,右邊及下邊的線定義可繪製區域,四周就是 padding
  • name.9.png
  • 見上面的代碼

怎麼設置按鈕的“.9”背景圖片?

  • 將 .9 圖片放置在 drawable目錄下,設置按鈕的 background 屬性 (改)
<Button android:background="@drawable/my_button_background"/>

如何使用 android sdk 中的製作.9文件的工具?如果不設置 padding 線,那內容到邊之間的 padding 怎麼確定,實驗一下?

  • 在 android 的 sdk 中的 tools 目錄下找到 draw9patch,啓動
  • 將上下左右的線拉到對應位置,然後保存
    鏈接 製作.9文件.

如何在studio中顯示代碼的行號?學會看錯誤提示信息,這很重要

  • 1.在代碼左邊空白區域右擊,選擇 Show Line Numbers
    2.File > Settings > Editor > General > Appearance > Show Line Numbers

文本框


輸入文本框的標籤是什麼?

  • EditText

如何指定輸入文本框的類型?如何組合輸入模式?

  • 通過 android:inputType 指定輸入類型,因而確定鍵盤類型
    例如 textEmailAddress、phone 等
  • 使用 | ,來同時組合設置多個值
<EditText android:inputType="textPostalAddress|textCapWords|textNoSuggestions" />

標籤屬性的值是不是可以通過 java 代碼進行修改?

  • 可以

landscape 和 portrait 什麼區別?如何在虛擬機上切換?

  • landscape,橫向
    portrait,縱向
  • 找到 手機旋轉的一個圖標

如何設置虛擬機的物理鍵盤或虛擬鍵盤?

  • Settings > Language&input > Default > Hardware

什麼是輸入鍵盤的 action?默認值是什麼?如何設置該 action?如何監聽該動作(監聽模板代碼)?

  • 鍵盤右下角的按鈕,即用戶輸入完成後的動作
  • Done
    若沒有顯式指定 action,系統會查看是否有設置了android:focusable的域 (不一定是文本框),
    若有,系統會執行本文本框的 actionNext 動作,這樣用戶可以進行下一個域的輸入
    若無,執行文本框的 actionDone 動作
  • 通過 android:imeOptions
  • 監聽
EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

如何添加其他的鍵盤flag與提供自動補全?如何在strings.xml中定義字符數組資源?

  • 設備 landscape 模式下,
    阻止進入全屏輸入模式android:imeOptions="flagNoExtractUi"
  • 提供自動補全
    1.AutoCompleteTextView 標籤加入佈局
    2.定義保存有所有文本補全的數組,放在 res/values/strings.xml 中
    3.在 Activity 或 Fragment 中寫入代碼
//獲取佈局文件中 AutoCompleteTextView 的引用
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);

// 從資源中獲取字符數組
String[] countries = getResources().getStringArray(R.array.countries_array);

// 創建 adapter,並把它設置到 AutoCompleteTextView 中
ArrayAdapter<String> adapter =
        new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);
textView.setAdapter(adapter);
  • 例如
<resources>
    <string-array name="countries_array">
        <item>Algeria</item>
        <item>American Samoa</item>
        <item>Angola</item>
        ...
    </string-array>
</resources>

如何在 java 代碼中獲取字符數組資源從而進行操作?理解代碼模板

  • 獲取資源
String[] countries = getResources().getStringArray(R.array.countries_array);

複選框


什麼是複選框?在佈局文件中是哪個標籤?

  • 允許用戶選擇若干項,CheckBox

複選框後的文字怎麼加上?

  • 用 text 屬性

如何設置複選框的單擊事件處理方法?若干複選框可以用同一個事件處理方法進行處理嗎?如何在方法中區分選擇的是哪個複選框?

  • 用 onClick 屬性
  • 可以
  • 用 view.getId 方法
public void onCheckboxClicked(View view) {
    // Is the view now checked?
    boolean checked = ((CheckBox) view).isChecked();

    // Check which checkbox was clicked
    switch(view.getId()) {
        case R.id.checkbox_meat:
            if (checked) {System.out.println("");}
            else {}
            break;
        case R.id.checkbox_cheese:
            if (checked) {}
            else {}
            break;
        // TODO: Veggie sandwich
    }
}

如何修改activity的佈局?一個activity同時可以有幾個佈局?

  • 更改相應的 .java 文件中 onCreate 方法中 setContentView(R.layout.佈局文件名);
  • 同時應該只能有一個

什麼是無線按鈕?在佈局文件中是哪個標籤?爲什麼要把這種標籤放在RadioGroup中?RadioGroup是哪個佈局的子類,這意味着什麼?如何設置無線按鈕的默認選擇?

  • 互斥的⚪單選按鈕,RadioButton
  • 爲了確保互斥
  • LinearLayout 的子類
  • 可以指定水平或垂直方向 (意味着RadioGroup也可看作線性佈局)
  • 設置 checked 屬性爲 true

如何設置無線按鈕的單擊事件處理方法?

  • 和 CheckBox 的類似

什麼是切換按鈕?是哪些標籤?如何在java程序中改變按鈕的狀態?如何響應用戶對按鈕的操作?(代碼模板)

  • 可以在兩種狀態中切換
  • ToggleButton 和 Switch
//java 中改變 ToggleButton 的狀態
ToggleButton toggleButton = (ToggleButton)findViewById(R.id.toggle_button);
toggleButton.setChecked(true);
toggleButton.toggle();

//響應用戶操作
ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // The toggle is enabled
        } else {
            // The toggle is disabled
        }
    }
});

定義某個RadioButton的android:checked爲true,意味着該項是默認選中的,但如果並沒有定義它的id,在運行時會發生什麼情況?

  • RadioButton 不互斥

Toast


註釋的快捷鍵是什麼?

  • Ctrl + /

Toast是什麼?它也是放在佈局文件中嗎?makeText方法的三個參數什麼含義?

  • 彈出的一個提示信息
  • 不是,代碼打開
  • 第一個爲 app 的 Context
    第二個爲顯示的文本信息
    第三個爲 toast 持續的時間

什麼是context?

  • Context是一個場景,描述的是一個應用程序環境的信息,即上下文,
    代表與操作系統的交互的一種過程
    簡單來說就是上下文環境

如何定義toast的顯示?

  • 例 將 toast 定位在左上角
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

如何創建定製的Toast視圖?inflater功能是什麼?如何設置這種方式的toast中的文字?如何將定製佈局應用到toast實例?通過setView方法設置視圖的Toast,怎麼構造toast實例?

  • 定製一個佈局文件 toast_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/toast_layout_root"
              android:orientation="horizontal"
              android:padding="8dp"
              android:background="#DAAA">
              
    <ImageView android:src="@drawable/droid"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_marginRight="8dp"/>
               
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#FFF"/>
              
</LinearLayout>
  • 將佈局文件取出
  • 取出佈局中的 TextView 然後 setText
  • 用 setView 將取出的 layout 應用到實例 toast 中
  • 用 new,構造函數參數是 上下文環境的實例 context
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout. toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

一個佈局案例


layout_weight這個屬性是什麼含義?

  • 表示在其父 ViewGroup 中的寬度
例 因爲 LinearLayout 是佈局的根 view,
它的大小又設置爲 "match_parent",所以它將充滿整個屏幕

RadioGroup是什麼?其什麼作用?它的父類是哪個?默認方向是什麼?怎麼改掉?

  • 無線按鈕的單選組合框
  • 用來放無線按鈕,確保按鈕互斥性
  • LinearLayout 類
  • 垂直方向,vertical
  • 通過 android:orientation 更改

RadioButton是什麼?爲什麼要加入RadioGroup中?如何默認選中?它的 id 有什麼特別的用處?

  • 無線按鈕
  • 確保互斥
  • checked 屬性設置爲 true
  • 用來區分選中的無線按鈕,無 id 時互斥性消失

怎麼將MainActivity的佈局改掉?

  • 找到 onCreate 回調方法,更改代碼中佈局文件名 activity_main2
setContentView(R.layout.activity_main2);

如何加入輸入的提示信息?

  • hint 屬性,無輸入時顯示的信息

如何將EditText指定爲輸入密碼類型的數據?

  • inputType 屬性,設置爲 textPassword,或 numberPassword 或其他 …Password

End.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章