iT邦幫忙

DAY 15
2

Android 學習手札系列 第 15

Day 15 - Android - 選擇

  • 分享至 

  • xImage
  •  

陸行鳥:「チョコ!チョコ!」
莫古哩:「…還是聽不懂啦…」
昨天知道了語系的設定後,每跳到新的activity都會被固定成被設定好的語系字串,若是要調整,還得要跳到選項或是程式改寫後再重跑一次!所以今天要帶大家看到如何用單選按鈕來做到這件事。

單選按鈕,從網頁的世代開始,就一直是被稱作「RadioButton」,而在 Android 的世界也不例外,用 "RadioGroup" 包住所有子選項,今天依舊是拿昨日的程式碼來延續,專案名稱請改為「Day15_Selection」,今天只要動 Chocobo 就好了。因為他一直讓我們聽不懂嘛XD

謎之音:明明就是你故意的…

空

先來看到下面這個 Chocobo 的介面,

RadioGroup 這個元件被放在 Form Widgets 裡面,請將他拉至介面中成為其中的元素,如同標示區塊2 一般,這時會看到他是直立式的,嗯~關鍵就在標示區塊3 的選項上,

接下來,就請各位將之調整成下圖的樣子吧

同時,請追加一個日文語系的目錄「values-ja」
(註:1.原本到昨天的進度已有一個 values-en-rUS 的美區英文的目錄。
2.倘若您是直接從 Mosil's Github 上抓下來的話,請留意是否仍為「values-jp」,若是請改成「values-ja」)
其內容如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Day15_選択する</string>
    <string name="title_activity_moogle">モーグリ</string>
    <string name="title_activity_chocobo">チョコボ</string>
    <string-array name="Signal">
        <item >いち</item>
        <item >に</item>
        <item >さん</item>
        <item >し</item>
        <item >ご</item>
        <item >ろく</item>
        <item >しち</item>
        <item >はち</item>
        <item >きゅう</item>
        <item >じゅう</item>
    </string-array>
</resources>

再來就是要了解程式的部份了,

//宣告一個 RadioGroup 的物件
RadioGroup mRdgLanguage = (RadioGroup) findViewById(R.id.rdg_language);
//定義當 RadioGroup 裡的成員被更動時,需要執行的事情
//請注意,這裡跟一樣的setOnClick不同,是用"setOnCheckedChange"
//另外,以之前一直讓大家看到這個"偵聽式(Listener)"一直是寫在括號裡的,今天我們將之移出
mRdgLanguage.setOnCheckedChangeListener(rdgLanguageChange);

在這之前,我們所有的按鈕偵聽式都是這麼寫的

btnBack.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        //執行動作
    }
});

當然這 RadioGroup 這個元素的動作我們也可以這麼寫,不過我們今天換個寫法,將偵聽式獨立出來成這樣

private RadioGroup.OnCheckedChangeListener rdgLanguageChange =
        new RadioGroup.OnCheckedChangeListener() {
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        //取得系統資源
        Resources resource = getResources();
        //取得資源設定
        Configuration conf = resource.getConfiguration();
        //先給一個初始的語系設定值
        conf.locale = Locale.TAIWAN;
        //判斷哪個 RadioButton 被按下
        if(checkedId == R.id.rdo_us){
            conf.locale = Locale.US;
        } else if(checkedId == R.id.rdo_jp){
            conf.locale = Locale.JAPAN;
        }
			        
        //取得設定的參數內容
        DisplayMetrics dm =resource.getDisplayMetrics();
        //更新
        resource.updateConfiguration(conf, dm);
        //^+++^
    }
};

嗯!就是將原本設定語系的部份拉到這邊來動作,這邊可以看到,在裡面的"onCheckedChanged"函式傳入了兩個參數,一個 RadioGroup 另外一個是 checkedId,後者就是我們要判斷是被按下哪個 RadioButton,而當中的 if...else... 就是設定成不同的語系地區嘍!

接下來,我們就真的來執行看看吧!

去選擇任何一個選項都會發現…

不能動驚

汗

嗯,別擔心,若您是跟著步驟走到這邊的話,沒錯!他是不會動的…XD

原因何在,請各位思考一下,我們按下單選按鈕時,我們希望他這時候會做什麼事呢?五秒鐘思考

沒錯!就是去變動下拉選單的文字語系嘛!
啊~疑惑
我上面沒有講

汗

那我現在說了呀瞎

(被毆)

總之~

就是要將下拉選單的動作獨立出來成這樣

private void setSpinnerView(){
    ArrayAdapter<CharSequence> adapterSignal = 
        ArrayAdapter.createFromResource(
            this, 
            R.array.Signal, 
            android.R.layout.simple_spinner_item);            
    adapterSignal.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mSpnChocobo.setAdapter(adapterSignal);
    mSpnChocobo.setSelection(mSignalId);
}

另外拉出了這個獨立的函式時,看到剛剛在寫的那段程式碼的下方,有看到在下註解的那行「//^+++^」了嗎XD
請在這裡補上「setSpinnerView();」

咦!

這時候變成,一進來時是空的了!要點選項後下拉選單才會出現東西!

別急!這時候也是對的!原因在,我們剛剛是將原本設定選單的那幾行程式"挖"出來,令之成為另外一個獨立的設定函式嘛!所以,一樣,請記得在剛剛挖出來的那個地方再補上「setSpinnerView();」。

什麼,可以正常執行驚
算您狠,一定是是用複製的,不是用剪下貼上的嗚

XD開個玩笑,希望各位客倌別生氣呀~
最後,請各位嘗試著依上述所說明的動作,將按鈕的偵聽式另外獨立出來,當做練習吧!

程式碼一樣可以從 Mosil's GitHub 取得哦!

《Day 14 - Android - 語言 Day 16 - Android - 點將》


上一篇
Day 14 - Android - 語言
下一篇
Day 16 - Android - 點將
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-10 14:29:08

請教一下
實際應用時
1.程式需要自已去判斷並載入對應的語系 resource
2.還是只要準備好各語系資料
由使用者在手機設定的語系做判斷
然後自動載入對應語系資料
疑惑


我自己再看了一下 source code
答案應該是 2
問題白問了
臉紅

mosil iT邦新手 4 級 ‧ 2012-10-11 09:32:32 檢舉

讚

我要留言

立即登入留言