【Android】FragmentでsetArgument()を使った値の受け渡し

Fragmentでのコンストラクタの引数によるFragmentへの値の受け渡しは推奨されていないのでBundleにラップして情報をFragmentクラスへ受け渡すsetArguments()を使用します。

なぜsetArguments()を使用するかは、参考サイトに詳しく載っていたので、ご覧下さい。

値の設定


setArguments()で値を設定します。

public static CategoryQuizFragment newInstance(String param) {
    CategoryQuizFragment fragment = new CategoryQuizFragment();
    Bundle args = new Bundle();
    args.putString("data", "データ");
    fragment.setArguments(args);
    return fragment;
}

値の取得


getArguments()を使用して値を取得します。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_category_quiz, container, false);

    Log.v("dataを表示", getArguments().getString("data"));

    return view;
}

参考サイト:

Y.A.M の 雑記帳: Android Fragment で setArguments() してるサンプルが多いのはなぜ?

【Android 実装の罠 #1】 Fragment#setArguments() | Developers.IO

フラグメントへの値の受け渡し | Android-Note

Android - ActivityのExtraやFragmentのArgumentを設定する責務は、呼び出される側に持たせたほうがいいんじゃねーのという提案 - Qiita

【Android】「cannot perform this action inside of onloadfinished」エラーの対処法

非同期処理が終わったタイミングで実行しようとした処理で「cannot perform this action inside of onloadfinished」というエラーが発生しています。

このエラーはGUIに関する操作をメインスレッド以外のスレッドから行おうとした場合に発生するものです。

このエラーを解消するためには以下のソースコードを記述します。

エラー解消方法


import android.os.Handler;
import android.os.Looper;

Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            // GUIに関する処理を記述
        }
    });

参考サイト:

Android アプリ開発で “cannot perform this action inside of onloadfinished” とエラーメッセージが表示された場面の対処法

【Android】EditTextの初期表示に薄く文字を表示

EditTextでの初期表示に薄く文字を表示するためには、android:hintを使用します。

使用例


<EditText
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:inputType="text"
    android:hint="@string/content_comment"
    android:id="@+id/edit_comment">

参考サイト:

四の五の: EditTextの初期表示に薄く文字を表示させるアレ

【Android】FragmentでfindViewById(Idを取得)する方法

FragmentでIdを取得するとき、findViewByIdをしてもIdを取得することができません。

FragmentはfindViewByIdが定義されていないからです。

ですが、FragmentでIdを取得する方法は簡単にできます。

Idの取得方法


Idの取得は、onCreateViewのなかで処理を行います。

一番最初の状態は以下のようになっていると思います。

public class BlankFragment extends Fragment {

    .
    .
    .

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    .
    .
    .

上記の状態から以下のように変更します。

public class BlankFragment extends Fragment {

    .
    .
    .

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank, container, false);

        // findViewByIdの前に「view」を付けてIdの取得
        Button btn = (Button) view.findViewById(R.id.button);

        .
        .
        .

        return view
    }

    .
    .
    .

View view = inflater.inflate(R.layout.fragment_blank, container, false);と書き換え、最後にreturn viewをします。

そのなかで、Idを取得するためにview.findViewByIdとします。findViewByIdのまえにviewを付けてあげることで、Idを取得できます。

【Android】Spinnerの使い方

Spinnerを使用することで、プルダウンまたはダイアログでアイテムを複数表示することができます。

アイテムの取得方法も2通りあったので、それも含め以下に書きます。

レイアウトの作成


<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner"
    android:spinnerMode="dialog" />

プルダウン表示の場合はdialog、プルダウン表示の場合はdropdownandroid:spinnerModeに指定します

アイテムの設定


表示するアイテムを設定するにはAdapterを作成し、Supinnerにセットします。

// Adapterの作成
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Adapterにアイテムを追加
adapter.add("red");
adapter.add("green");
adapter.add("blue");
Spinner spinner = (Spinner) findViewById(id.spinner);
    
// SpinnerにAdapterを設定
spinner.setAdapter(adapter);

選択したアイテムの取得方法1


spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Spinner spinner = (Spinner) parent;
        // 選択したアイテムを取得
        String item = (String) spinner.getSelectedItem();

        // ログで確認
        Log.v("spinner item", item);
    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {// アイテムを選択しなかったとき
    }
});

選択したアイテムの取得方法2


// レイアウトからSpinnerを取得
Spinner item = (Spinner) findViewById(R.id.spinner);
// 選択したアイテムを取得
String selected = (String) item.getSelectedItem();

参考サイト:

スピナー(Spinner)を使用するには - 逆引きAndroid入門

Androidプログラミングメモ Spinner - arcanum_jpの日記

Android Spinnerで、選択された順番を取得する -でじうぃき

文字列から数値、数値から文字列へ変換するには - 逆引きAndroid入門

【Android】EditTextでの入力制限(バリデーション)の種別まとめ

入力欄を表示するEditTextで、入力するデータの種別に応じて指定値をandroid:inputType="指定値"に指定することで、入力の制限(バリデーション)ができるようになります。

種類がたくさんあるので以下にまとめます。

指定値の種別


指定値 動作
none 入力不可
text 文字を入力する場合
textCapCharacters すべて大文字で入力する場合
textCapWords 単語の先頭を大文字で入力する場合
textCapSentences 文章の先頭を大文字で入力する場合
textAutoCorrect 文字のスペルミスを自動で修正する場合
textAutoComplete 文字の補完入力する場合
textMultiLine 文字を複数行入力する場合
textImeMultiLine 通常の文字入力時は複数行入力を許可せず、IMEによって複数行入力を設定する場合
textUri URLを入力する場合
textEmailAddress メールアドレスを入力する場合
textEmailSubject メールの件名を入力する場合
textShortMessage ショートメッセージを入力する場合
textLongMessage ロングメッセージを入力する場合
textPersonName 人名を入力する場合
textPostalAddress 住所を入力する場合
textPassword パスワード入力する場合
textVisiblePassword 隠蔽せずにパスワード入力する場合
textWebEditText HTMLを入力する場合
textFilter 他のデータでフィルタされた文字を入力する場合
textPhonetic 発音表記を入力する場合
number 数値入力する場合
numberSigned 符号付きの数値を入力する場合
numberDecimal 小数入力する場合
phone 電話番号を入力する場合
datetime 日付時刻を入力する場合
date 日付を入力する場合
time 時刻を入力する場合

参考サイト:

UIコンポーネント/TextView - Android Wiki*