JAVAのプリファレンスの扱いに困っています

このQ&Aのポイント
  • 独学で勉強している初心者ですが、JAVAのプリファレンスの扱いについて困っています。
  • アンドロイドアプリのシューティングゲームを作りながらプリファレンスを保存する画面を作りたいのですが、うまくいきません。
  • 現在のコードでは、アクティビティでしかプリファレンスを扱えず、初期画面に戻ると設定が元に戻ってしまいます。どのようにすれば解決できるでしょうか?
回答を見る
  • ベストアンサー

JAVAのプリファレンスがうまくいかず困っています

独学で勉強初めてまだ一ヶ月程度なのですがプリファレンスの扱いがうまくいかず困っています。 とりあえずアンドロイドアプリのシューティングゲームを作りながら判らなかったら調べつつ進めているので、根本的に間違っているかもですが御教授頂ければと思います。 ゲームのステータスをいじる画面をviewクラスで作り保存できるようにと思ったのですが、アクティビティでしかプリファレンスを扱えず無理やりやろうとしてこうなってしまいました。 ------------------------- public class SettingActivity extends Activity { int speed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 speed = pref.getInt("speed",1); //呼び出し 第二引数は初期値 LinearLayout l = new LinearLayout(this); l.setOrientation(LinearLayout.VERTICAL); setContentView(l); l.addView(new Setting(this)); } @Override protected void onPause() { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 Setting set = new Setting(this); Editor date = pref.edit(); date.putInt("speed",set.getSpeed()); date.commit(); //保存 super.onPause(); } -------------------------------- public class Setting extends View { SettingActivity activity = (SettingActivity)this.getContext(); int speed = activity.speed; void setSpeed(int sp) { speed = sp; } int getSpeed() { return speed; } public void onDraw(Canvas c) { super.onDraw(c); if(画面の表示が変わったとき) speed = 表示の値に; setSpeed(speed); } ----------------------------- 色々調べた結果このような感じになったのですが、どうしても最初の画面に戻ったら元に戻ってしまいます。 どのようにすればうまくいきますでしょうか? よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>アクティビティでしかプリファレンスを扱えず無理やりやろうとしてこうなってしまいました。 ここを修正するべきではないでしょうか。何をして何がどういった理由でダメだったのか、 そちらの直すべきです。

参考URL:
http://wada811.blog.fc2.com/?tag=PreferenceManager
kinoshi1985
質問者

お礼

ありがとうございます。 viewクラスでプリファレンスの引数にコンテキストを渡したactivityクラスを入れることで解決できました! (言葉の使い方が合っているかわかりません・・・) 最初うまくいかなかったのはviewクラスで.getDefaultSharedPreferences(this);と書き込んでいたのがいけなかったようです。 的確なアドバイスありがとうございました。

関連するQ&A

  • 二つのコードを繋げたい

    eclipseでandroidプログラミングをしている超初心者です。 いろいろ試しましたがうまくいかないので力を貸してください。 コード1 final String TAG = "DialogTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((Button)findViewById(R.id.button1)) .setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { new AlertDialog.Builder(MainActivity.this) .setTitle("Hello, AlertDialog!") .setPositiveButton( "Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton( "No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); } }); } } コード2 EditText mEditText_number = null; LinearLayout mLinearLayout_no_button = null; Button mButton_dial = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLinearLayout_no_button = new LinearLayout(this); mEditText_number = new EditText(this); mEditText_number.setText("117"); mLinearLayout_no_button.addView(mEditText_number); mButton_dial = new Button(this); mButton_dial.setText("電話をかける"); mLinearLayout_no_button.addView(mButton_dial); mButton_dial.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { performDial(); } }); setContentView(mLinearLayout_no_button); } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_CALL) { performDial(); return true; } return false; } public void performDial(){ if(mEditText_number!=null){ try { startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mEditText_number.getText()))); } catch (Exception e) { e.printStackTrace(); } } } } AlertDialogを表示するコード1で”YES”を押したらコード2を使って電話がかかるようにしたいです。 回答よろしくお願いします。

  • 無名クラスからのstartActivity

    androidの勉強をしております。 無名クラス内からIntentのコンストラクタに渡す引数がthisでは不十分なのはどうしてですか? 以下がソース例です。 略 public class HelloAndroid extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); 略 button1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(HelloAndroid.this, HA2.class); startActivity(intent); } }); } }

    • ベストアンサー
    • Java
  • アンドロイドのJAVAの基本(文法)について

    アンドロイドの開発を目指して基本から勉強していますが、 本を買っても何のことかさっぱりで困っています。 基本中の基本で恐縮ですが、習熟している方、お助けください。 1.下記はどういう意味でしょうか? public class DBSampleA extends Activity implements View.OnClickListener{ ※implementsの意味を調べても何のことかさっぱりです・・ 2.下記の@Override とは何を意味するのでしょうか? @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); 3.また、onCreate(Bundle savedInstanceState) の中の、 Bundle savedInstanceState はどういう位置付けなのでしょうか?

    • ベストアンサー
    • Java
  • クリックして画像を変え、一定時間経過後もとに戻す

    androidアプリを作成している初心者です。 画像をクリックすると画像が変わるようになるようにしたいと思ってます。 画像を変えるところまではできたのですが、 一定時間経過後にもとに戻すにはどうしたらいいかがわかりません。 以下、ソースコード。 public class MainActivity extends Activity { ImageView iv; Bitmap bmp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.HORIZONTAL); ll.setGravity(Gravity.CENTER); setContentView(ll); //画像表示 iv = new ImageView(this); bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ikari); iv.setImageBitmap(bmp); ll.addView(iv); //画像をクリックした時に関数を呼び出す iv.setOnClickListener(new img_ac()); } //画像を変える class img_ac implements OnClickListener { public void onClick(View v) { ImageView tmp = (ImageView) v; tmp.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); } } } 一定時間経過後に元の画像に戻すには、どのようにしたら良いのでしょうか。

    • ベストアンサー
    • Java
  • アンドロイド JAVA 警告

    アンドロイド 初心者です package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new testView(this)); } class testView extends View { public testView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(0, 0, 100, 50, paint); } } } このプラグラムで"Paint paint = new Paint();"のところで "Avoid object allocations during draw/layout operations (preallocate and reuse instead)" の警告が出ます、これを取る方法はありませんか。

    • ベストアンサー
    • Java
  • androidプログラミングについての質問

    このプログラムについて質問したいのですが public class InOutTest extends Activity { /** Called when the activity is first created. */ public TextView txtInfo; public EditText edtText; public Button outputbutton; public TextView txtResult; public TextView txtjudge; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //レイアウト作成 ここから LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //レイアウトを見えるようにする //レイアウト作成 ここまで //GUI部品作成 ここから // ラベル txtInfo = new TextView(this); txtInfo.setText("check spell same or not:"); layout.addView(txtInfo); // エディタ edtText = new EditText(this); layout.addView(edtText); // ボタン txtResult = new Button(this); txtResult.setText("same or difference"); layout.addView(txtResult); // 結果表示用ラベル txtjudge = new TextView(this); txtjudge.setTextSize(30f); layout.addView(txtjudge); //GUI部品作成 ここまで txtResult.setOnClickListener(new OnClickListener(){ public void onClick(View v) { String strInch = ""; if (edtText==txtInfo) strInch = "typed as same"; txtResult.setText(strInch); } }); } } txtResultに文章を引き渡して表示させたいのですが やり方が分かりません お時間のある方でいいので どなたかよろしければ教えてください

  • このプログラムについて質問したいのですが

    public class InOutTest extends Activity { /** Called when the activity is first created. */ public TextView txtInfo; public EditText edtText; public Button outputbutton; public TextView txtResult; public TextView txtjudge; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //レイアウト作成 ここから LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //レイアウトを見えるようにする //レイアウト作成 ここまで //GUI部品作成 ここから // ラベル txtInfo = new TextView(this); txtInfo.setText("check spell same or not:"); layout.addView(txtInfo); // エディタ edtText = new EditText(this); layout.addView(edtText); // ボタン txtResult = new Button(this); txtResult.setText("same or difference"); layout.addView(txtResult); // 結果表示用ラベル txtjudge = new TextView(this); txtjudge.setTextSize(30f); layout.addView(txtjudge); //GUI部品作成 ここまで txtResult.setOnClickListener(new OnClickListener(){ public void onClick(View v) { String strInch = ""; if (edtText==txtInfo) strInch = "typed as same"; txtResult.setText(strInch); } }); } } txtResultに文章を引き渡して表示させたいのですが やり方が分かりません お時間のある方でいいので どなたかよろしければ教えてください

    • ベストアンサー
    • Java
  • Android JAVAへでの質問です

    (←※この部分!) の意味がわからないのでどなたか教えていただけないでしょうか? private EditText edit1; ですが、なぜ private がついているのでしょうか?なくても動きましたが何か意味があるのでしょうか? そしてどうして、この子はここにいるのでしょうか? Button btn1 と一緒に仲良くいてもいいんじゃないでしょうか? ================ import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.view.*; import android.view.View.OnClickListener; import android.widget.*; public class Test2Activity extends Activity { private EditText edit1;(←※この部分!) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit1 = (EditText)this.findViewById(R.id.EditText1); Button btn1 = (Button)this.findViewById(R.id.button1); btn1.setOnClickListener(new MyClickA()); } class MyClickA implements OnClickListener { public void onClick(View view){ Editable e = edit1.getText(); int n = Integer.parseInt(e.toString()); Toast toast = Toast.makeText(getApplicationContext(), "数値=" + n, Toast.LENGTH_SHORT); toast.show(); } } }

    • ベストアンサー
    • Java
  • 以下のサンプルでのthisが指すものについて・・・

    package ya.Sample; import android.app.*; import android.os.*; import android.widget.*; public class Sample2 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); setContentView(ll); TextView tv = new TextView(this); tv.setText("ようこそアンドロイドへ!"); ll.addView(tv); } } このサンプルにおいてLinearLayout ll = new LinearLayout(this)のthisの指すものについて質問があります。私がこのthisはSample2を指すんですよねと質問したところ 引数thisは Sample2 を指しますよね 大雑把な理解だなぁ。 Sample2は「型」なのだから、例えば「整数」や「文字列」のような概念だ。 thisは特定のインスタンスを指すのだから、1024とか"abc"とか、そのクラスに属するもののうち、特定の具象を指すものだ。 27や47が整数である、というのと同じ意味で、thisはSample2ではあるのだが、こういう場合は普通「thisはSample2のインスタンスである」と表現する とある方に回答をいただいたのですが 「thisはSample2のインスタンスである」と表現する の部分のインスタンスが理解できません・・・ インスタンスとはClassから製造されたObjectであるはずですからこの場合 Sample2クラスを雛型として作られたObjectをThisは指すとかってに再解釈してしまい、 この引数Thisはオブジェクトのことでありnew LinearLayout(this)において、LinearLayoutは引数にオブジェクトを持っているということでしょうか?そして継承関係よりこのオブジェクトはContextクラス(?)も含んでいるため、LinearLayoutクラスのLinearLayout(Context context)は呼び出しに成功するということなのでしょうか? 今までJavaの引数で見てきたのが実数や文字だったので、引数がオブジェクト(?)なのにちょっと違和感がありまして・・・ 回答していただけたらうれしいですよろしくお願いいたします!!!

    • ベストアンサー
    • Java
  • androidでアプリを作ろうとしてるのですが

    package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class InOutTest extends Activity { /** Called when the activity is first created. */ public TextView txtInfo; public EditText edtText; public Button outputbutton; public TextView txtResult; public TextView txtjudge; public String strInch; public String gettext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //レイアウト作成 ここから LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //レイアウトを見えるようにする //レイアウト作成 ここまで //GUI部品作成 ここから // ラベル txtInfo = new TextView(this); txtInfo.setText("check"); strInch = ("check"); layout.addView(txtInfo); // エディタ edtText = new EditText(this); layout.addView(edtText); // ボタン txtResult = new Button(this); txtResult.setText("same or difference"); layout.addView(txtResult); // 結果表示用ラベル txtjudge = new TextView(this); txtjudge.setText("check"); layout.addView(txtjudge); //GUI部品作成 ここまで txtResult.setOnClickListener(new OnClickListener(){ public void onClick(View v) { gettext = edtText.toString(); if (strInch==gettext){ txtjudge.setText("ok"); } }; }); }} 上のプログラムで strInchに入ってるデータとgettextで取得した文章を比較して同じなら txtjudgeにOKと引き渡して表示させたいのですがうまく動きません 何方かどうぞよろしくお願い致します

    • ベストアンサー
    • Java

専門家に質問してみよう