質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3421閲覧

ListViewのなかで設置したswitchの動きが取得できない。

kitarou

総合スコア8

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/08/18 04:57

編集2019/08/19 12:35
コード ```Android Studio で、言語はKotlinを使用して開発をしています。 Listviewに配置したswitchの動きがリスナーでとれないので困っています。 気づいたことなどありましたら、教えて頂けると幸いです。 NavigationDrawer の Navigationview に入れ子にしたListviewがあり、そこにswitchを設置したのですが、 項目をクリックした時に期待通り動いてくれません。 現状では以下のコードでアプリが起動直後に落ちる結果になります。 期待値としては、LIstviewのswitchをタップ(切り替え)すると、ONとOFFそれぞれでトーストを表示したいです。 元々、navigationViewを表示するのにハンバーガメニューなど使用せず。複数のボタン押下で左から表示されるという動きを 期待していて、可能であれば、一つのnavigationviewで、以下の様な menu レイアウトを切り替えるという事がしたいです。 app:menu="@menu/navigation_drawer" しかしこの方法も見つかっていないので、もしご存知の方がいらっしゃいましたら教えて頂けると幸いです。 navigationviewnのレイアウトです。

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_marginTop="30dp"
app:headerLayout="@layout/nav_header_main"
android:fitsSystemWindows="false"
android:visibility="invisible"
app:itemTextColor="#FEFEFE">

<ListView android:id="@+id/nav_menu_items_switch" android:divider="@null" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="0dp" android:layout_marginTop="20dp"/> </android.support.design.widget.NavigationView>
` }'````````` これがListの1行レイアウトです。
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView android:id="@+id/image" android:layout_width="54dp" android:layout_height="50dp"/>
<TextView android:text="TextView" android:layout_width="161dp" android:layout_height="46dp" android:id="@+id/title" android:layout_weight="1"/>
<Switch android:text="Switch" android:layout_width="164dp" android:layout_height="53dp" android:id="@+id/switch_1" android:layout_weight="1" android:checked="true" android:focusable="false" android:layout_marginRight="30dp"/>
</LinearLayout>

ここがlistを表示するActivityの 全文です。 本来setOnItemClickListener にタップされた時の動きをかくと思うのですが、switchだとadapterに書いている記事を見かけたので、同じくそちらに書いているのですが間違えているでしょうか。 ```ここに言語を入力 class Webview_indexActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_webview_index) val switch = Switch(this) switch.setOnCheckedChangeListener({ button, isChecked -> val text = if (isChecked) "checked" else "unchecked" Toast.makeText(this, text, Toast.LENGTH_LONG).show() }) //val switchmenu = nav_view.menu.findItem(R.id.navigation_notifications) // // switchmenu.actionView = switch mutableListOf<MenuItem>() val menuItem_right = mutableListOf<MenuItem>() menuItem_right.add(MenuItem("設定",R.drawable.button_category_clothes_icon)) menuItem_right.add(MenuItem("設定",R.drawable.button_category_food_icon)) menuItem_right.add(MenuItem("設定",R.drawable.button_category_hobby_icon)) nav_menu_items.adapter = MenuItemAdapter(this,menuItem_right) nav_menu_items.setOnItemClickListener {parent, view, position, id -> Toast.makeText(this, "Clicked: ${id}", Toast.LENGTH_SHORT).show() drawer_layout.closeDrawer(Gravity.LEFT) drawer_layout.closeDrawer(Gravity.RIGHT) } //左側の switchのlistの設定 mutableListOf<MenuItem_switch>() val menuItem_left_switch = mutableListOf<MenuItem_switch>() menuItem_left_switch.add(MenuItem_switch("設定",switch)) menuItem_left_switch.add(MenuItem_switch("設定",switch)) menuItem_left_switch.add(MenuItem_switch("設定",switch)) nav_menu_items_switch.setOnItemClickListener { parent, view, position, id -> drawer_layout.closeDrawer(Gravity.LEFT) drawer_layout.closeDrawer(Gravity.RIGHT) } //左側の通常のlistの設定 mutableListOf<MenuItem_normal>() val menuItem_left_normal = mutableListOf<MenuItem_normal>() menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon)) menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon)) menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon)) nav_menu_items_switch.setOnItemClickListener { parent, view, position, id -> Toast.makeText(this, "Clicked: ${id}", Toast.LENGTH_SHORT).show() drawer_layout.closeDrawer(Gravity.LEFT) drawer_layout.closeDrawer(Gravity.RIGHT) } nav_view.setNavigationItemSelectedListener(this) nav_view_right.setNavigationItemSelectedListener(this) right_btn.setOnClickListener { nav_view_right.setBackgroundResource(R.drawable.pic_rightbar_bg2) this.drawer_layout.openDrawer(nav_view_right) } menuBtn.setOnClickListener { nav_view.setBackgroundResource(R.drawable.pic_category_bg) nav_menu_items_switch.adapter = MenuItem_switchAdapter(this,menuItem_left_switch) this.drawer_layout.openDrawer(nav_view) } menu2Btn.setOnClickListener { nav_view.setBackgroundResource(R.drawable.pic_detailed_search_bg) nav_menu_items_switch.adapter = MenuItem_normalAdapter(this,menuItem_left_normal) this.drawer_layout.openDrawer(nav_view) } } override fun onNavigationItemSelected(item: android.view.MenuItem): Boolean { when (item.itemId) { R.id.navigation_home -> Toast.makeText(this,"テスト表示1",Toast.LENGTH_LONG).show() R.id.navigation_dashboard -> Toast.makeText(this,"テスト表示2",Toast.LENGTH_LONG).show() R.id.navigation_notifications -> Toast.makeText(this,"テスト表示3",Toast.LENGTH_LONG).show() R.id.config1 -> Toast.makeText(this,"テスト表示4",Toast.LENGTH_LONG).show() R.id.config2 -> Toast.makeText(this,"テスト表示5",Toast.LENGTH_LONG).show() } drawer_layout.closeDrawer(Gravity.LEFT) drawer_layout.closeDrawer(Gravity.RIGHT) return true } override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.bottom_navigation_item,menu) return super.onCreateOptionsMenu(menu) } }

1行のモデルクラス

import android.media.Image import android.widget.ImageView import android.widget.Switch class MenuItem_switch ( val title2: String, val switch2: Switch )

adapterの全文

class MenuItem_switchAdapter(val context: Context, val items: List<MenuItem_switch>): BaseAdapter() { val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater override fun getCount(): Int { return items.count() } override fun getItem(position: Int): MenuItem_switch { return items[position] } override fun getItemId(position: Int): Long { return position.toLong() } override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view_switch = layoutInflater.inflate(R.layout.menu_item2,parent,false) view_switch.title.text = items[position].title2 view_switch.switch_1.setOnCheckedChangeListener{ buttonView, isChecked -> if (isChecked){ Toast.makeText(context, "ON: $", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(context, "OFF: ${items[position].switch2}", Toast.LENGTH_SHORT).show() } } return view_switch }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/08/18 09:16

「アプリが起動直後に落ち」た時のログに例外等は表示されていないでしょうか.
kitarou

2019/08/18 12:51

返信ありがとうございます。 IllegalStateException: switch_1 must not be null というログが出ていました。 adapterの方で、view_switch.title.text = items[position].title2 のようにswitch2を設定しないといけないと思うのですが、switchの場合どのように書けばいいのか考えています。
jimbe

2019/08/18 13:04

例外の文内にソース名や行番号等は書かれていませんか. どこで発生しているのか分からないのですが. また switch2 というのはコードに見たりませんが, 何でしょうか.
kitarou

2019/08/18 23:02

失礼しました。 listを表示するActivity の中の3行目の以下の箇所になります。 menuItem_left_switch.add(MenuItem_switch("設定",switch_1)) switch2というのは1行レイアウトのモデルクラスの、スイッチの変数になります。 追加させていただきました。 今の所このswitch2が紐づいていない(adapterで紐づいていない)ので nullになっていると思われます。 switchの場合, ON,OFFの処理をadapterに書いてしまってもいいのかも疑問に感じています。
jimbe

2019/08/19 01:59 編集

Adapter, Activity 等の全体をご提示くださいますか. 例外の発生する箇所に至るフローのどこに原因があるのかを調べられません. また, 省略などの操作によって原因箇所が消えてしまう可能性があります. 直接ご質問と関係ないのですが, 変数名等が java の一般的な命名にあっていません. [Java言語の命名指針] ( https://qiita.com/rkonno/items/1b30daf83854fecbb814 ) また, 変数名に数字がついているのは, 基本的には良くない命名と考えます. たかが変数名と思われるかもしれませんが, "機能を示す命名で無い1文字違い"というのは, 結構間違え易いです. ```view_switch.title.text = items[position].title2``` のように, "2" のついている変数の値を, ついていない変数に入れるような記述が見られる場合, 変数の取り違いが発生し易く, 他の箇所で間違えていないかを疑う必要が出てきます.
kitarou

2019/08/19 12:53 編集

返信ありがとうございます。 先に報告させて頂きますと、スイッチが動作してONOFFを検知するようになりました。 Activity の menuItem_left_switch.add(MenuItem_switch("設定",switch_1)) の中の switch_1を、本来別目的(別の箇所でしよう予定だったswitchの定数) val switch = Switch(this)を入れてみると、onとoffでトーストが表示されるようになりました。 正直なんでこれで動くようになったのかいま一つ理解していないのですが、、 実体となるものが必要だったということでしょうか。 確かにswitch_1では1行レイアウトのidにすぎない(入れ物)ので、中身がないものを参照させることになるからではないかと考えています。 残る問題は、ナビゲーションを一旦隠してまた表示すると、OFFにしていてもONに戻ってしまっているので、ON,OFFの状態を保持できるようにする為にはまた色々調べていこうと思います。 Adapter, Activity の全体 は貼り付けさせて頂きます。もしよろしければご確認頂ければと思います。 また、変数の命名規則についても考えになかったので大変参考になりました。以後気をつけます。 一旦解決とさせて頂きます。 ありがとうございます。
jun74

2019/08/19 12:44

javaでRecyclerViewの場合ですが、switchオン・オフ検知後に以下の処理をしないとswitchの状態保持出来ませんでした。 (検知したswitchから、そのポジションのArrayListにも変更値セット。) private ArrayList<Boolean> m_sw; ・・・ //リサイクルビューのスイッチ更新 m_sw.set(position , holder.sw.isChecked()); ListViewでもArrayListと同じ扱いの項目があるのか謎ですが。。
kitarou

2019/08/19 12:56

コメントありがとうございます。set メソッドで更新する処理が必要なんですね、試してみたいと思います。
jimbe

2019/08/19 14:18 編集

ご提示ありがとうございます. スイッチの ON/OFF の保持に関しましては, jun74 さんの仰る通り, スイッチの状態を別途保持しておく必要があります. といいますか, ListView は表示しかしませんので, データを持っていなくては表示できません. ですが構造としましては, private ArrayList<Boolean> m_sw; と別に持つのではなく, MenuItem_switch に入れておくのが良いかと思います. class MenuItem_switch ( val title2: String, //val switch2: Switch val switch2: Boolean ) そして, getView にて text の設定と同時に switch には switch2 の値を入れます. view_switch.title.text = items[position].title2 view_switch.switch_1.isChecked = items[position].switch2 リスナでは items を更新します. view_switch.switch_1.setOnCheckedChangeListener{ buttonView, isChecked -> items[position].switch2 = isChecked :
jimbe

2019/08/19 14:34

MenuItem_switch の構造が変わるため, > menuItem_left_switch.add(MenuItem_switch("設定",switch)) を menuItem_left_switch.add(MenuItem_switch("設定",true)) //第二引数は true か false とする必要があります. Switch の実体は要りません.
kitarou

2019/08/20 11:32

ご丁寧に説明頂き恐縮です、 なるほど、保持する為に、Boolean をクラスで持てばいいんですね、 試してみます。 ありがとうございます!
guest

回答1

0

自己解決

Activity 内の、menuItem_left_switch.add(MenuItem_switch("設定",switch_1)) の中の
switch_1を、 val switch = Switch(this) という 実体?を宣言して、これと入れ替えてあげると、
adapter の setOnCheckedChangeListener でswitch のON,OFFを検知できるようになりました。
まだ動きの原因がはっきり理解していませんが、ひとまず主題の問題の動きは確認できたので解決とさせて頂きます。

投稿2019/08/19 12:48

kitarou

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問