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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3204閲覧

Preferenceを利用した設定画面の作成

syyyow

総合スコア28

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1グッド

0クリップ

投稿2018/06/21 13:05

編集2018/06/23 02:06

ネットの記事を参考に
設定画面の作成をしていたのですが
MainActivityから遷移したSettingsActivityの作り方がいまいちわかりません。。

java

1MainActivity 2 3import android.os.Bundle; 4import android.support.annotation.NonNull; 5import android.support.design.widget.BottomNavigationView; 6import android.support.v4.app.Fragment; 7import android.support.v7.app.AppCompatActivity; 8import android.view.MenuItem; 9import android.widget.TextView; 10 11public class MainActivity extends AppCompatActivity { 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 BottomNavigationView navigation = findViewById(R.id.navigation); 19 navigation.setOnNavigationItemSelectedListener(navListner); 20 } 21 22 private BottomNavigationView.OnNavigationItemSelectedListener navListner = 23 new BottomNavigationView.OnNavigationItemSelectedListener() { 24 @Override 25 public boolean onNavigationItemSelected(@NonNull MenuItem item) { 26 Fragment selectedFragment = null; 27 28 switch (item.getItemId()) { 29 case R.id.navigation_product: 30 selectedFragment = new Product(); 31 break; 32 case R.id.navigation_cart: 33 selectedFragment = new Cart(); 34 break; 35 case R.id.navigation_delivery_status: 36 selectedFragment = new Delivery_Status(); 37 break; 38 case R.id.navigation_mypage: 39 selectedFragment = new Mypage(); 40 break; 41 } 42 43 getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, 44 selectedFragment).commit(); 45 46 return true; 47 } 48 }; 49}

java

1Mypage 2 3import android.os.Bundle; 4import android.preference.PreferenceActivity; 5import android.preference.PreferenceManager; 6import android.support.v4.app.Fragment; 7 8public class Mypage extends Fragment { 9 10 @Override 11 public void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 14 PreferenceManager prefMgr = getPreferenceManager(); 15 prefMgr.setSharedPreferencesName( "name_and_age" ); 16 17 addPreferencesFromResource( R.xml.mypage ); 18 } 19} 20

お聞きしたい内容としましては
①遷移するにあたって、このコードの書き方で大丈夫かという点です。

現在、こちらのコードでは
エラー: シンボルを見つけられません シンボル: メソッド getPreferenceManager() 場所: クラス Mypage

エラー: シンボルを見つけられません シンボル: メソッド addPreferencesFromResource(int) 場所: クラス Mypage

こちらの二つのエラーが出ています。

よろしくお願い致します。

追記写真↓
イメージ説明

keicha_hrs👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

単なるFragmentクラスはgetPreferenceManager()もaddPreferencesFromResource()も持っていません。Fragmentとして作りたいのなら、PreferenceFragmentを用いればいいのではないでしょうか。

Java

1public class Mypage extends PreferenceFragment {

これは申し訳ない。PreferenceFragmentはSupport Libraryではないandroid.app.Fragmentを継承しているから、確かにこれでは変数selectedFragmentに入れられないですね。これを通すには、android.support.v4.app.Fragmentを継承したPreferenceFragmentCompatにしなければならないのか。こちらならば、変数selectedFragmentにそのまま代入できるでしょう。

PreferenceFragmentCompatでは生成されるときにonCreatePreferences()が呼ばれるので、下記のように実装すればいいと思います。

Java

1import android.os.Bundle; 2import android.support.v7.preference.PreferenceFragmentCompat; 3import android.support.v7.preference.PreferenceManager; 4 5public class Mypage extends PreferenceFragmentCompat { 6 7 @Override 8 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 9 PreferenceManager prefMgr = getPreferenceManager(); 10 prefMgr.setSharedPreferencesName("name_and_age"); 11 12 addPreferencesFromResource(R.xml.mypage); 13 } 14}

また、PreferenceFragmentCompatを使うためには、app/build.gradleのdependenciesブロックに

gradle

1dependencies { 2 // 略 3 implementation 'com.android.support:preference-v7:27.1.1' 4}

のように1行追加する必要がありますね。

PreferenceFragmentCompatのリファレンス

投稿2018/06/21 14:10

編集2018/06/21 15:21
keicha_hrs

総合スコア6768

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

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

syyyow

2018/06/21 14:36

keicha_hrs様 いつもありがとうございます。 エラーが解消致しました。 MainActivityの case R.id.navigation_mypage: selectedFragment = new Mypage(); にて エラー: 不適合な型: MypageをFragmentに変換できません: というエラーが出てしまいます。。 こちらはどう変換できればよいでしょうか?
syyyow

2018/06/21 15:46

ありがとうございます。 エラーがなくなりました。 ですが、自分のコードが何かおかしいのか 実装させ、mypageを開こうとすると アプリが落ちてしまいます。。 xmlのコードも表記しておきます。 (こちらは自分で作成したものです) mypage.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="マイページ"> <EditTextPreference android:key="user_name" android:title="お名前" android:summary="あなたのお名前を教えてください" android:dialogTitle="お名前" /> <EditTextPreference android:key="user_age" android:title="年齢" android:summary="あなたの年齢を教えてください" android:dialogTitle="年齢" android:inputType="number" /> </PreferenceCategory> </PreferenceScreen> pref_headers.xml <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <!-- These settings headers are only used on tablets. --> <header android:fragment="jp.aftech.myapplication.Mypage$GeneralPreferenceFragment" android:icon="@drawable/ic_info_black_24dp" android:title="@string/pref_header_general" /> <header android:fragment="jp.aftech.myapplication.Mypage$NotificationPreferenceFragment" android:icon="@drawable/ic_notifications_black_24dp" android:title="@string/pref_header_notifications" /> <header android:fragment="jp.aftech.myapplication.Mypage$DataSyncPreferenceFragment" android:icon="@drawable/ic_sync_black_24dp" android:title="@string/pref_header_data_sync" /> </preference-headers>
keicha_hrs

2018/06/22 14:31 編集

そのまま実行すると、LogCatに java.lang.IllegalStateException: Must specify preferenceTheme in theme というエラーが出ているんじゃないでしょうか?これに対応するために、res/styles.xmlを開いて <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 中略 --> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> </style> のように、preferenceThemeという名前のitemを追加する必要があるみたいですね。 ただ、preference-headersを使った画面構成はPreferenceActivity固有の機能なんじゃないですか?これをPreferenceFragmentCompatに適用することはできないんじゃないかと思いますが。Preferences画面をMainActivityのFragmentの一つとして構成するのではなく、PreferenceActivityを継承した別のActivityとするように改める必要がありそう?
syyyow

2018/06/23 02:06

なるほどですね。。 私は単純にiphoneの設定画面のような機能をshoppingサイトに入れたいのですが この方法以外に簡易的な方法はないですかね?>< どのようなものか一応写真を追記いたします
keicha_hrs

2018/06/23 06:50

私もどう答えればいいのかわからなくなってしまいました。SettingsActivityを参考にしたのなら、MyPageも参考にした通りAppCompatPreferenceActivityを継承して作ればいいのでは?onNavigationItemSelected()の中のswitch文で、R.id.navigation_mypageが選ばれたときだけIntentによって画面遷移するようにすれば済むのではないかと思うのですが、他が選ばれたときと同様に変数selectedFragmentを介さなければならない縛りでもあるのでしょうか?
syyyow

2018/06/23 07:34

いえ、 特に縛りはございません。 ただ、知識が足らず、このようなやり方にたどり着いた次第でございます。。 もう少し簡易的にMypage(設定画面)を作成したいと発言しましたのは SettingActivityのやり方で設定画面を構築して行くには 少し複雑すぎるかな、、という自分の判断で発言しました。 もう一度文章見直しまして 再度、構築頑張って見ます。。
syyyow

2018/06/23 08:21

すみません、 「ただ、preference-headersを使った画面構成はPreferenceActivity固有の機能なんじゃないですか?これをPreferenceFragmentCompatに適用することはできないんじゃないかと思いますが。Preferences画面をMainActivityのFragmentの一つとして構成するのではなく、PreferenceActivityを継承した別のActivityとするように改める必要がありそう?」 ここの部分をもう少しわかりやすく教えていただけますでしょうか?><
keicha_hrs

2018/06/23 10:44

preference-headersタグを使ったXMLをアプリに読み込むにはloadHeadersFromResource()というメソッドを呼ぶ必要がありますが、このメソッドはPreferenceActivityクラスにはあって、PreferenceFragmentクラスやPreferenceFragmentCompatクラスにはありません。ですから、PreferenceActivityクラスを使う必要があるのでは?ということです。
syyyow

2018/06/24 07:43

なるほどですね。。 いろいろ試してはみたものの自分なりに解決できず 作成もできなかったです。。。 もう一度最初から調査し直しやってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問