LoginSignup
0
0

More than 5 years have passed since last update.

listViewに置かれたボタンからdialog fragmentを表示しようとして泥沼だった話

Last updated at Posted at 2019-03-07

今回はかなり苦戦しました。(毎回ですけど)

タイトルの通りです。

どうにかこれを達成できたのでその手順を書きます。

まず全体の流れは

※④を訂正し、③を打ち消しました。(2019/3/7)

①listViewでクリックイベントの結果を取得
→②"listViewを表示しているfragment"に上述の結果を渡す
→③"上述のfragmentを表示しているactivity"に上述の結果を渡す
→④ ②のfragmentでdialog fragmentを表示する(訂正あり)

このようなややこしい流れになりました。

コメント欄にてご指摘をいただきましたが、③は完全に勘違いで、activityからしかdialogFragmentを呼び出せないということはなく、fragmentからdialogFragmentを直接呼び出すことが可能でした。④にて後述します。

というわけで手順を①から見ていきます。

①listViewでクリックイベントの結果を取得

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    // ここに処理を書く
    }
});

これは毎度おなじみですね。
R.id.buttonのbuttonの部分は、xmlファイルのコンポーネントのIDと同じにしてください。

②"listViewを表示しているfragment"に上述の結果を渡す
これがなかなか見つからなかったコードです。

SomeAdapter.java
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ここに処理を書く
        ((ListView) parent).performItemClick(v, position, R.id.button);
    }
});
SomeFragment.java
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (view.getId()) {
            case R.id.button:
                //buttonがclickされたらここに飛びます
        }
    }
});

以上の処理で、fragmentに飛べます。

parentってなんぞや。
→getViewの引数、ViewGroupです。

positionってなんぞや。
→これもlistViewの引数getViewのint型の引数です

※getViewはアダプターを作るときに呼ばれるメソッドです。検索したら出てきます。

④ ②のfragmentでdialog fragmentを表示する(訂正あり)
アクティビティにdisplayDialogメソッドを追加します

SomeFragment.java
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (view.getId()) {
            case R.id.button:
                //buttonがclickされたらここに飛びます
                SomeDialogFragment dialog = new SomeDialogFragment();
                dialog.show(getFragmentManager(), "tag");
        }
    }
});

dialog fragmentをインスタンス化してshowメソッドを呼ぶだけで表示できたようでとても悲しいです。
あと、getFragmentManagerとgetSupportFragmentManagerの違いについてもご指摘をいただきました。
以下はコメント欄の引用です。

バージョン違いではなく、継承元のクラスが何か、によって、getSupportFragmentManagerを使うべきなのかgetFragmentManagerを使うべきなのかが変わります。

android.app.Activityと、
android.app.DialogFragment
android.app.Fragment
なら、
Activity#getFragmentManagerを使う

android.support.v7.app.AppCompatActivityと、
android.support.v4.app.Fragment
android.support.v4.app.DialogFragment
なら、
AppCompatActivity#getSupportFragmentManagerを使う

この組み合わせで使わないと、いろいろと不具合が起こります。
そして、API28(AndroidP)から、android.app.DialogFragmentとandroid.app.Fragmentは非推奨となったので、実質、後者の組み合わせで行くべきかと思います。

どっちかが新しいんだろうなくらいの感覚でテキトーにoption + enterで追加していたので、きちんと組み合わせがあったらしくちょっと感動しました。

@kasa_le さん
この度はありがとうございました。
精進します!

という感じでした。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0