facebook twitter hatena line email

「Android/PreferenceFragmentCompat」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(PreferenceFragmentを追加)
(inconvertible types; cannnot cast Preferenceエラーが出る場合)
 
(同じ利用者による、間の16版が非表示)
行4: 行4:
 
[[android/Fragment]] [ショートカット]
 
[[android/Fragment]] [ショートカット]
  
==PreferenceFragmentを追加==
+
==PreferenceFragmentCompatを追加==
 +
 
 +
build.gradleに以下を追加
 +
<pre>
 +
dependencies {
 +
    implementation 'com.android.support:appcompat-v7:28.0.0'
 +
    implementation 'com.android.support:preference-v7:28.0.0'
 +
}
 +
</pre>
  
 
MainActivity.java
 
MainActivity.java
行11: 行19:
 
import android.os.Bundle;
 
import android.os.Bundle;
  
import com.kaji.fragmentmyapplication.ui.main.MainFragment;
+
import com.kaji.fragmentmyapplication.ui.main.PrefsFragment;
  
 
public class MainActivity extends AppCompatActivity {
 
public class MainActivity extends AppCompatActivity {
行21: 行29:
 
         if (savedInstanceState == null) {
 
         if (savedInstanceState == null) {
 
             getSupportFragmentManager().beginTransaction()
 
             getSupportFragmentManager().beginTransaction()
                     .replace(R.id.container, MainFragment.newInstance())
+
                     .replace(R.id.container, PrefsFragment.newInstance())
 
                     .commitNow();
 
                     .commitNow();
 
         }
 
         }
行28: 行36:
 
</pre>
 
</pre>
  
build.gradleに以下を追加
+
ui/main/PrefsFragment.java
 +
<pre>
 +
 
 +
import android.content.SharedPreferences;
 +
import android.os.Bundle;
 +
import android.support.v7.preference.PreferenceFragmentCompat;
 +
import android.support.v7.preference.Preference;
 +
import android.support.v7.preference.EditTextPreference;
 +
import android.support.v7.preference.PreferenceScreen;
 +
 
 +
import com.kaji.fragmentmyapplication.R;
 +
 
 +
public class PrefsFragment extends PreferenceFragmentCompat {
 +
    private EditTextPreference editTextPreference;
 +
    public static PrefsFragment newInstance() {
 +
        return new PrefsFragment();
 +
    }
 +
    @Override
 +
    public void onCreatePreferences(Bundle bundle, String s) {
 +
        setPreferencesFromResource(R.xml.preferences, s);
 +
 
 +
        editTextPreference = (EditTextPreference)findPreference("editTextId");
 +
        if (editTextPreference.getText() == null || editTextPreference.getText().length() < 1) {
 +
            editTextPreference.setSummary(getResources().getString(R.string.edit_text_hint));
 +
        } else {
 +
            editTextPreference.setSummary(editTextPreference.getText());
 +
        }
 +
        editTextPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
 +
            @Override
 +
            public boolean onPreferenceClick(Preference preference) {
 +
                EditTextPreference editPref = (EditTextPreference)preference;
 +
                if (editPref.getText() != null) {
 +
                    editPref.setText(editPref.getText());
 +
                }
 +
                return true;
 +
            }
 +
        });
 +
        editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
 +
            @Override
 +
            public boolean onPreferenceChange(Preference preference,
 +
                                              Object newValue) {
 +
                EditTextPreference editPref = (EditTextPreference)preference;
 +
                editPref.setSummary(newValue.toString());
 +
                return true;
 +
            }
 +
        });
 +
        // imageのPreferenceScreenをクリックしたとき
 +
        PreferenceScreen imagePreference = (PreferenceScreen)getPreferenceScreen().findPreference("image");
 +
        imagePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
 +
            public boolean onPreferenceClick(Preference preference) {
 +
                //Intent intent = new Intent(getContext(), HogehogeActivity.class);
 +
                //startActivity(intent);
 +
                return true;
 +
            }
 +
        });
 +
    }
 +
}
 +
</pre>
 +
 
 +
res/layout/main_activity.xml
 +
<pre>
 +
<?xml version="1.0" encoding="utf-8"?>
 +
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 +
    xmlns:tools="http://schemas.android.com/tools"
 +
    android:id="@+id/container"
 +
    android:layout_width="match_parent"
 +
    android:layout_height="match_parent"
 +
    tools:context=".MainActivity" />
 +
</pre>
 +
 
 +
res/layout/preferences.xml
 +
<pre>
 +
<?xml version="1.0" encoding="utf-8"?>
 +
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 +
    <SwitchPreferenceCompat
 +
        android:defaultValue="false"
 +
        android:key="red"
 +
        android:summary="This is red."
 +
        android:title="red" />
 +
    <EditTextPreference
 +
        android:key="editTextId"
 +
        android:title="editText"
 +
        android:summary="@string/edit_text_hint"
 +
        android:hint="@string/edit_text_hint"
 +
        />
 +
    <PreferenceScreen android:key="image"
 +
            android:title="image"
 +
            />
 +
</PreferenceScreen>
 +
</pre>
 +
res/values/string.xml
 +
<pre>
 +
<resources>
 +
    <string name="app_name">FragmentMyApplication</string>
 +
    <string name="hello_world">Hello world!</string>
 +
    <string name="action_settings">Settings</string>
 +
    <string name="edit_text_hint">hint</string>
 +
</resources>
 +
 
 +
</pre>
 +
 
 +
==inconvertible types; cannnot cast Preferenceエラーが出る場合==
 +
古いPreferenceがあれば削除する
 +
import android.preference.Preference;
 +
import android.preference.EditTextPreference;
 +
import android.preference.ListPreference;
 +
新しいPreferenceを追加
 +
import android.support.v7.preference.Preference;
 +
import android.support.v7.preference.EditTextPreference;
 +
import android.support.v7.preference.ListPreference;
 +
Preference screen = (Preference) getPreferenceManager().findPreference("key1");
 +
or
 +
Preference editTextPreference = (Preference) findPreference("key1");
 +
 
 +
 
 +
==com.android.support.support:customtabs:26.1.0 same versionエラーが出るとき==
 +
以下をapp/build.gradleへ追加
 
<pre>
 
<pre>
 
dependencies {
 
dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
+
    implementation "com.android.support:customtabs:28.0.0"
    implementation 'com.android.support:preference-v7:28.0.0'
+
    implementation 'com.android.support:support-media-compat:28.0.0'
 +
    implementation 'com.android.support:support-v4:28.0.0'
 
}
 
}
 
</pre>
 
</pre>
 +
 +
==java.lang.IllegalStateException: Must specify preferenceTheme in themeエラーが出たとき==
 +
res/values/styles.xml
 +
    <!-- Application theme. -->
 +
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 +
        <!-- Customize your theme here. -->
 +
        <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
 +
    </style>
 +
@style/PreferenceThemeOverlayを追加
  
 
==参考==
 
==参考==
 +
【Android】続・PreferenceFragmentCompatを使った設定画面(kotrin?)
 
http://phicdy.hatenablog.com/entry/setting_ui_by_preference_fragment_compat
 
http://phicdy.hatenablog.com/entry/setting_ui_by_preference_fragment_compat
 +
 +
PreferenceActivity/PreferenceFragmentを使った設定画面
 +
http://phicdy.hatenablog.com/entry/2015/09/08/%E3%80%90Android%E3%80%91PreferenceActivity/PreferenceFragment%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2

2018年12月27日 (木) 16:44時点における最新版

Fragmentについて

Fragmentについて理解してない場合はこちら

android/Fragment [ショートカット]

PreferenceFragmentCompatを追加

build.gradleに以下を追加

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:preference-v7:28.0.0'
}

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.kaji.fragmentmyapplication.ui.main.PrefsFragment;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, PrefsFragment.newInstance())
                    .commitNow();
        }
    }
}

ui/main/PrefsFragment.java


import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.Preference;
import android.support.v7.preference.EditTextPreference;
import android.support.v7.preference.PreferenceScreen;

import com.kaji.fragmentmyapplication.R;

public class PrefsFragment extends PreferenceFragmentCompat {
    private EditTextPreference editTextPreference;
    public static PrefsFragment newInstance() {
        return new PrefsFragment();
    }
    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        setPreferencesFromResource(R.xml.preferences, s);

        editTextPreference = (EditTextPreference)findPreference("editTextId");
        if (editTextPreference.getText() == null || editTextPreference.getText().length() < 1) {
            editTextPreference.setSummary(getResources().getString(R.string.edit_text_hint));
        } else {
            editTextPreference.setSummary(editTextPreference.getText());
        }
        editTextPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                EditTextPreference editPref = (EditTextPreference)preference;
                if (editPref.getText() != null) {
                    editPref.setText(editPref.getText());
                }
                return true;
            }
        });
        editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference,
                                              Object newValue) {
                EditTextPreference editPref = (EditTextPreference)preference;
                editPref.setSummary(newValue.toString());
                return true;
            }
        });
        // imageのPreferenceScreenをクリックしたとき
        PreferenceScreen imagePreference = (PreferenceScreen)getPreferenceScreen().findPreference("image");
        imagePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                //Intent intent = new Intent(getContext(), HogehogeActivity.class);
                //startActivity(intent);
                return true;
            }
        });
    }
}

res/layout/main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

res/layout/preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreferenceCompat
        android:defaultValue="false"
        android:key="red"
        android:summary="This is red."
        android:title="red" />
    <EditTextPreference
        android:key="editTextId"
        android:title="editText"
        android:summary="@string/edit_text_hint"
        android:hint="@string/edit_text_hint"
        />
    <PreferenceScreen android:key="image"
            android:title="image"
            />
</PreferenceScreen>

res/values/string.xml

<resources>
    <string name="app_name">FragmentMyApplication</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="edit_text_hint">hint</string>
</resources>

inconvertible types; cannnot cast Preferenceエラーが出る場合

古いPreferenceがあれば削除する

import android.preference.Preference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;

新しいPreferenceを追加

import android.support.v7.preference.Preference;
import android.support.v7.preference.EditTextPreference;
import android.support.v7.preference.ListPreference;
Preference screen = (Preference) getPreferenceManager().findPreference("key1");

or

Preference editTextPreference = (Preference) findPreference("key1");


com.android.support.support:customtabs:26.1.0 same versionエラーが出るとき

以下をapp/build.gradleへ追加

dependencies {
     implementation "com.android.support:customtabs:28.0.0"
     implementation 'com.android.support:support-media-compat:28.0.0'
     implementation 'com.android.support:support-v4:28.0.0'
}

java.lang.IllegalStateException: Must specify preferenceTheme in themeエラーが出たとき

res/values/styles.xml

   <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
       <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
   </style>

@style/PreferenceThemeOverlayを追加

参考

【Android】続・PreferenceFragmentCompatを使った設定画面(kotrin?) http://phicdy.hatenablog.com/entry/setting_ui_by_preference_fragment_compat

PreferenceActivity/PreferenceFragmentを使った設定画面 http://phicdy.hatenablog.com/entry/2015/09/08/%E3%80%90Android%E3%80%91PreferenceActivity/PreferenceFragment%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2