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

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

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

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

Q&A

解決済

2回答

440閲覧

Android4.3でSwitchPreferenceが勝手に連動する

退会済みユーザー

退会済みユーザー

総合スコア0

Android

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

0グッド

0クリップ

投稿2018/01/12 02:29

編集2018/01/12 04:02

PreferenceFragmentにSwitchPreferenceを2つ並べます。
設定値はデフォルト、コードもいじりません。

この状態で、Android4.3で実行すると、
同じ画面内のSwtichがすべてオンオフ連動してしまいます。

Android8で試したところ、個別にオンオフできました。

Android4.3で普通にSwitchPreferenceを使うにはどうしたらよいでしょうか?

以下追加です。

フラグメントを呼び出すアクティビティ

java

1 2import android.os.Bundle; 3import android.support.v7.app.AppCompatActivity; 4 5public class SettingsActivity extends AppCompatActivity { 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_settings); 11 12 getFragmentManager().beginTransaction() 13 .replace(R.id.fragment_settings_container, PreferenceTestFragment.newInstance()) 14 .commit(); 15 } 16}

アクティビティのレイアウト

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/fragment_settings_container" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context="XXXXXXXXXXXX.myapplication.MainActivity"> 9 10</android.support.constraint.ConstraintLayout> 11

呼び出されるフラグメント

java

1 2import android.os.Bundle; 3import android.preference.PreferenceFragment; 4 5public class PreferenceTestFragment extends PreferenceFragment { 6 7 public static PreferenceTestFragment newInstance() { 8 return new PreferenceTestFragment(); 9 } 10 11 @Override 12 public void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 addPreferencesFromResource(R.xml.pref_test); 15 } 16}

フラグメントのレイアウトXML

xml

1<?xml version="1.0" encoding="utf-8"?> 2<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 3 4 <SwitchPreference 5 android:defaultValue="false" 6 android:key="switch_preference_1" 7 android:title="Switch preference" /> 8 <SwitchPreference 9 android:defaultValue="false" 10 android:key="switch_preference_2" 11 android:title="Switch preference" /> 12 13</PreferenceScreen>

新規プロジェクトから試してみたところ、再現できました。
よろしくお願いいたします。

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

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

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

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

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

yona

2018/01/12 02:40

設定値がわかるファイルを質問に追記してください。
guest

回答2

0

ベストアンサー

ちょっとavdでandroid4.3な端末を作って試してみましたが、確かにそのような現象が起きますね。
どうもconstraintlayoutとpreferenceの組み合わせが悪いようで、ConstraintLayoutではなくFrameLayoutにすると問題なく動きました。

もしConstraintLayoutを使用するのであれば、サポートライブラリを使ってみてはいかがでしょうか。
こちらでも動きました。ただし、多少手間です。

build.gradleに依存関係を追加

gradle

1dependencies { 2 compile 'com.android.support:appcompat-v7:25.+ 3 compile 'com.android.support:preference-v14:25.+ 4}

上記のように、「preference-v14」を加えます。
「25.+」は、既にappcompatを使用しているようなので、そちらに合わせてください。

importを変更

java

1//import android.preference.PreferenceFragment 2import android.support.v14.preference.PreferenceFragment

PreferenceFragmentを変更

java

1public class PreferenceTestFragment extends PreferenceFragment { 2 @Override 3 public void onCreate(Bundle savedInstanceState) 4 { 5 super.onCreate(savedInstanceState); 6 // addPreferencesFromResource(R.xml.pref_test); 7 } 8 9 @Override 10 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) 11 { 12 setPreferencesFromResource(R.xml.pref_test, rootKey); 13 } 14}

サポートライブラリのPreferenceFragmentは、onCreatePreferencesというabstractメソッドが
あるので、そちらでリソースを読み込みます。

Activityスタイルに追加

「res/values/styles.xml」にActivityのスタイルを定義していると思いますが、そちらに項目を追加します。

xml

1<resources> 2 <style name="AppTheme.NoActionBar"> 3 <!-- 以下の行を追加 --> 4 <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> 5 </style> 6</resources>

投稿2018/01/12 16:08

katsuko

総合スコア3469

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

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

退会済みユーザー

退会済みユーザー

2018/01/13 00:14

ご回答ありがとうございました。 FrameLayoutで大丈夫です。正常に動きました。 サポートライブラリ情報もありがとうございます。サポートライブラリの方が望ましいとは聞いているので、全体の動きん問題がなければこちらに移行してみます。
guest

0

key属性をa,b等の単純な名前に変えても同じですか?

投稿2018/01/12 05:57

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2018/01/12 06:08

aとbで試しましたが、同じでした。
退会済みユーザー

退会済みユーザー

2018/01/13 00:11

ご回答ありがとうございました。 やはりバグでしたか、URLもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問