###AndroidアプリをJavaで作成しています。プリファレンスについて質問です。
はじめまして。
半年前からJavaを習い始め、Androidアプリ開発は1ヶ月未満の初心者です。
RPGのようなアプリを作成しており、アプリ内にデータを保持するのにプリファレンスというものがあるのを知って実装したいと思っております。
しかし、プリファレンスに関してはネットで調べた知識しかなく、コードをどう書いたら実装できるのか、何故うまくいかないのか分かりません。
主人公キャラを男性か女性かラジオボタンで選択 → ダイアログが出る → 進むとプリファレンスに主人公の初期データを登録
という流れにしたいと思っています。
###該当ソースコード
「First.java」(最初に起動されるもの。ラジオボタンやダイアログが出る)
「chara_pref.java」(キャラクターのデータをプリファレンスに登録)
「PrefAct.java」(PreferenceActivityで何かする必要があるとネットで見て作ったもの)と、
「ch_main.xml」(データを登録したいXML)
の4つを掲載します。
●First.java(全文)
クラスについて…
First extends Activity : 主にViewをセットしている。画面表示用
ChooseMain implements View.OnClickListener : ダイアログのカスタムレイアウトを呼び出している
DialogFragBoy extends DialogFragment : 「男の子」を選んだ際に出るダイアログの設定
DialogFragGirl extends DialogFragment : 「女の子」を選んだ際に出るダイアログの設定
「First」で「setOnClickListener(new ChooseMain())」を呼んでいます。
時数の関係で割愛しています
class ChooseMain implements View.OnClickListener { public void onClick(View v) { RadioButton rb = (RadioButton) v; if(rb == boy) { System.out.println("男の子ダイアログ生成 : First"); manage = getFragmentManager(); frag = new DialogFragBoy(); frag.show(manage, "Choose Main"); } else if(rb == girl) { System.out.println("女の子ダイアログ生成 : First"); manage = getFragmentManager(); frag = new DialogFragGirl(); frag.show(manage, "Choose Main"); } } } public static class DialogFragBoy extends DialogFragment { private AlertDialog dialogBoy ; private AlertDialog.Builder alert; chara_pref cp; public Dialog onCreateDialog(final Bundle savedInstanceState) { alert = new AlertDialog.Builder(getActivity()); // カスタムレイアウトの生成 View alertView = getActivity().getLayoutInflater().inflate(R.layout.dialogboy, null ); Button b = (Button) alertView.findViewById(R.id.button); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("男の子クリック : First"); cp = new chara_pref(); cp.chara_main("boy"); } }); alert.setView(alertView); dialogBoy = alert.create(); dialogBoy.show(); return dialogBoy; } } public static class DialogFragGirl extends DialogFragment { private AlertDialog dialogGirl ; private AlertDialog.Builder alert; chara_pref cp; public Dialog onCreateDialog(Bundle savedInstanceState) { alert = new AlertDialog.Builder(getActivity()); // カスタムレイアウトの生成 View alertView = getActivity().getLayoutInflater().inflate(R.layout.dialoggirl, null ); Button b = (Button) alertView.findViewById(R.id.button); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("女の子クリック : First"); cp = new chara_pref(); cp.chara_main("girl"); // Intent inte = new Intent(chara_pref.class); } }); alert.setView(alertView); dialogGirl = alert.create(); dialogGirl.show(); return dialogGirl; } } }
●「chara_pref.java」(修正依頼をいただき、全文掲載しました)
package hiso.rpg; //import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; //import android.os.PersistableBundle; import android.preference.PreferenceActivity; //import android.preference.PreferenceFragment; import android.preference.PreferenceManager; public class chara_pref extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void chara_main(String s) { System.out.println("主人公プリファレンス登録メソッド : chara_pref"); // SharedPreferences pref = getSharedPreferences("ch_main", MODE_PRIVATE); // PreferenceFragment pf = new PrefFrag(); // startPreferenceFragment(pf, false); startActivity(new Intent(this, PrefAct.class)); SharedPreferences ch_main = PreferenceManager.getDefaultSharedPreferences(this); ed.putString("main_sx", main_sx); ed.putInt("main_hairstyle", main_hs); ed.putInt("main_haircolor", main_hc); ed.putInt("main_eyestyle", main_es); ed.putInt("main_eyecolor", main_ec); ed.putInt("main_job", main_job); // 攻撃力 : main_atk // 防御力 : main_def // 素早さ : main_spe // 賢さ : main_wis // 悪運 : main_luk ed.putInt("main_atk", 3); ed.putInt("main_def", 3); ed.putInt("main_spe", 4); ed.putInt("main_wis", 2); ed.putInt("main_luk", 2); ed.commit(); Intent inte = new Intent(this, Walk.class); startActivity(inte); } }
●「PrefAct.java」
public class PrefAct extends PreferenceActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("接続 : PrefAct"); getSharedPreferences("ch_main", MODE_PRIVATE); // getPreferences(MODE_PRIVATE); // addPreferencesFromResource(R.xml.ch_main); }
●「ch_main.xml」(主人公のデータを登録したいXML)
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <Preference android:title="攻撃力" android:key="main_atk"/> <Preference android:title="防御力" android:key="main_def"/> <Preference android:title="素早さ" android:key="main_spe"/> <Preference android:title="賢さ" android:key="main_wis"/> <Preference android:title="悪運" android:key="main_luk"/> </PreferenceScreen>
長くなってしまいました。申し訳ありません。
「主人公プリファレンス登録メソッド」という文字まではコンソールに出力されるので、「chara_pref.java」に行っているのは行っているのだと思います。
いろいろ試していて余計なコメントアウトがあります。すみません。
###発生したエラー
49.844 2664-2664/hiso.rpg E/AndroidRuntime: FATAL EXCEPTION: main Process: hiso.rpg, PID: 2664 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132) at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:374) at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:369) at hiso.rpg.chara_pref.chara_main(chara_pref.java:35) at hiso.rpg.First$DialogFragGirl$1.onClick(First.java:120) at android.view.View.performClick(View.java:4780) at android.view.View$PerformClick.run(View.java:19866) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
エラーが出ている「First.java」の120行目は cp.chara_main("girl");
「chara_pref.java」の35行目は startActivity(new Intent(this, PrefAct.class));
表示される2つのボタンのうち「女の子」をクリックし、進んだ場合のエラーです。
「男の子」をクリックしても同じエラーが出ます。
###補足情報(言語/FW/ツール等のバージョンなど)
Java / Android Studio / Nexus 7 で動作確認中
初心者なのでいろいろと間違っているかもしれませんが、お手柔らかにご教授くださると嬉しいです。
どうぞよろしくお願いいたします。