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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

Q&A

解決済

1回答

715閲覧

設定画面のスピナーで決定した通貨のシンボルを他のアクティビティに反映させたい

Yakusugi

総合スコア123

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android

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

0グッド

0クリップ

投稿2022/06/05 13:23

編集2022/06/12 15:04

Androidの家計簿アプリをJavaで作成しています。
下記スクショの通り、Spinnerを使って米ドル、日本円、ユーロから通貨を選べるようにしています。
ここでやりたいことは、上記Spinnerで選んだ通貨のシンボルでアプリ上の全ての金額に関わる部分に反映させることです。(例えば、ユーロであれば€のシンボルに)。

下記スクショの例では、図1の通貨設定画面で、例えばEuroを選んだ場合、図2(購入商品入力画面)のEnter PriceのEditTextにデフォルトで設定されている$シンボルを€シンボルに変更するような仕様にしたいです。

通貨設定画面はBudgetTrackerSettingsActivity、購入商品入力画面NewBudgetTrackerと、それぞれ別々のActivityとなるので、BudgetTrackerSettingsActivityで設定した内容を、どのようにNewBudgetTracker含め、別のActivitやクラスに対して反映させるのか、ヒントがあればご教示ください。

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

追記:
状況を細かく共有するため、新たにCurrency, CurrencySpinnerAdapterクラスを記載しました。

図1(通貨設定画面)
イメージ説明

図2 (ブレークポイント)
イメージ説明

BudgetTrackerSettingsActivity.java

package com.myproject.offlinebudgettrackerappproject; <import箇所は省略> import androidx.appcompat.app.AppCompatActivity; import com.myproject.offlinebudgettrackerappproject.adapter.CurrencySpinnerAdapter; public class BudgetTrackerSettingsActivity extends AppCompatActivity { Spinner spinner; public static String spinnerText; Button currencyBtn; String selectedCurrency; SharedPreferences sharedPreferences; private static final String PREF_CURRENCY_FILENAME = "CURRENCY_SHARED"; private static final String PREF_CURRENCY_VALUE = "currencyValue"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_budget_tracker_settings); Currency.initCurrencies(); spinner = (Spinner) findViewById(R.id.currency_spinner); currencyBtn = (Button) findViewById(R.id.currency_btn); CurrencySpinnerAdapter currencySpinnerAdapter = new CurrencySpinnerAdapter(this, R.layout.currency_spinner_adopter, Currency.getCurrencyArrayList()); spinner.setAdapter(currencySpinnerAdapter); sharedPreferences = getSharedPreferences(PREF_CURRENCY_FILENAME, Context.MODE_PRIVATE); spinner.setSelection(sharedPreferences.getInt(PREF_CURRENCY_VALUE, 0)); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { Currency currency = (Currency) spinner.getSelectedItem(); spinnerText = currency.getCurrency(); currencyBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { selectedCurrency = spinnerText; SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("CURRENCY", selectedCurrency); editor.putInt(PREF_CURRENCY_VALUE, position); editor.commit(); Toast.makeText(BudgetTrackerSettingsActivity.this, "Currency Saved", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(BudgetTrackerSettingsActivity.this, MainActivity.class); startActivity(intent); finish(); } }); } @Override public void onNothingSelected(AdapterView<?> adapterView) { spinnerText = null; } }); // spinner.setSelection(currency.ordinal()); } }

Currency.java

package com.myproject.offlinebudgettrackerappproject; import java.util.ArrayList; public class Currency { private static ArrayList<Currency> currencyArrayList = new ArrayList<>(); static { initCurrencies(); } private String id; private String currency; public Currency(String id, String currency) { this.id = id; this.currency = currency; } public Currency() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCurrency() { return currency; } public void setCurrency(String currency) { this.currency = currency; } public static void initCurrencies() { Currency usd = new Currency("0", "US Dollars"); currencyArrayList.add(usd); Currency jpy = new Currency("1", "Japanese Yen"); currencyArrayList.add(jpy); Currency euro = new Currency("2", "Euro"); currencyArrayList.add(euro); } public int getCurrencyImage() { switch (getId()) { case "0": return R.drawable.ic_money; case "1": return R.drawable.ic_yen; case "2": return R.drawable.ic_euro; } return R.drawable.ic_money; } public static ArrayList<Currency> getCurrencyArrayList() { return currencyArrayList; } }

CurrencySpinnerAdapter.java

package com.myproject.offlinebudgettrackerappproject.adapter; <import箇所は省略> public class CurrencySpinnerAdapter extends ArrayAdapter<Currency> { LayoutInflater layoutInflater; public CurrencySpinnerAdapter(@NonNull Context context, int resource, @NonNull List<Currency> currencies) { super(context, resource, currencies); layoutInflater = LayoutInflater.from(context); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View rowView = layoutInflater.inflate(R.layout.currency_spinner_adopter, null, true); Currency currency = getItem(position); TextView textView = (TextView) rowView.findViewById(R.id.currency_name_textview); ImageView imageView = (ImageView) rowView.findViewById(R.id.currency_symbol); textView.setText(currency.getCurrency()); imageView.setImageResource(currency.getCurrencyImage()); return rowView; } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if (convertView == null) { convertView = layoutInflater.inflate(R.layout.currency_spinner_adopter, parent, false); } Currency currency = getItem(position); TextView textView = (TextView) convertView.findViewById(R.id.currency_name_textview); ImageView imageView = (ImageView) convertView.findViewById(R.id.currency_symbol); textView.setText(currency.getCurrency()); imageView.setImageResource(currency.getCurrencyImage()); return convertView; } }

HomeFragment.java (sharedPreferences 受け取り箇所)
※上記画像(Home画面)のCurrent Currency下のtextView

sharedPreferences = getActivity().getSharedPreferences(PREF_CURRENCY_FILENAME, 0); //選択された通貨の設定 String currentCurrency = sharedPreferences.getString("CURRENCY", ""); int currentCurrencyNum = sharedPreferences.getInt("PREF_CURRENCY_VALUE", 0); //126行目 Currency currency = Currency.getCurrencyArrayList().get(currentCurrencyNum); currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(currency.getCurrencyImage(), 0, 0, 0);

IndexOutOfBoundsException(エラー内容)

2022-06-12 09:57:04.765 32399-32399/com.myproject.offlinebudgettrackerappproject E/AndroidRuntime: FATAL EXCEPTION: main Process: com.myproject.offlinebudgettrackerappproject, PID: 32399 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:437) at com.myproject.offlinebudgettrackerappproject.HomeFragment.onCreateView(HomeFragment.java:126) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138) at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072) at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432) at android.app.Activity.performStart(Activity.java:7848) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

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

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

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

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

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

guest

回答1

0

ベストアンサー

SharedPreferences を用いるのは如何でしょうか。


フラグメントでセッティング画面とメイン画面を作ってやってみました。
drawable に ic_money, ic_yen, ic_euro という各アイコンがある前提です。

java

1import androidx.annotation.*; 2import androidx.appcompat.app.AppCompatActivity; 3import androidx.fragment.app.Fragment; 4 5import android.content.*; 6import android.os.Bundle; 7import android.view.*; 8import android.widget.*; 9 10public class MainActivity extends AppCompatActivity { 11 private static final String PREF_CURRENCY_FILENAME = "CURRENCY_SHARED"; 12 private static final String PREF_CURRENCY_VALUE = "currencyValue"; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 Button settingButton = findViewById(R.id.settingButton); 20 settingButton.setOnClickListener(v -> { 21 getSupportFragmentManager().beginTransaction() 22 .replace(R.id.fragment_container, new SettingFragment()) 23 .commit(); 24 }); 25 26 Button mainButton = findViewById(R.id.mainButton); 27 mainButton.setOnClickListener(v -> { 28 getSupportFragmentManager().beginTransaction() 29 .replace(R.id.fragment_container, new MainFragment()) 30 .commit(); 31 }); 32 } 33 34 enum Currency { 35 USD("US Dollers", R.drawable.ic_money), 36 JPY("Japanese Yen", R.drawable.ic_yen), 37 EURO("Euro", R.drawable.ic_euro); 38 39 final String text; 40 final int drawableResId; 41 Currency(String text, int drawableResId) { 42 this.text = text; 43 this.drawableResId = drawableResId; 44 } 45 } 46 47 public static class SettingFragment extends Fragment { 48 SettingFragment() { 49 super(R.layout.fragment_setting); 50 } 51 @Override 52 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 53 super.onViewCreated(view, savedInstanceState); 54 55 SharedPreferences pref = requireActivity().getSharedPreferences(PREF_CURRENCY_FILENAME, Context.MODE_PRIVATE); 56 Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)]; 57 58 Spinner spinner = view.findViewById(R.id.currency_spinner); 59 spinner.setAdapter(new CurrencySpinnerAdapter()); 60 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 61 @Override 62 public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { 63 SharedPreferences.Editor editor = pref.edit(); 64 editor.putInt(PREF_CURRENCY_VALUE, position); 65 editor.commit(); 66 } 67 @Override 68 public void onNothingSelected(AdapterView<?> adapterView) { 69 } 70 }); 71 spinner.setSelection(currency.ordinal()); 72 } 73 74 class CurrencySpinnerAdapter extends BaseAdapter { 75 @Override 76 public int getCount() { 77 return Currency.values().length; 78 } 79 80 @Override 81 public Object getItem(int i) { 82 return Currency.values()[i]; 83 } 84 85 @Override 86 public long getItemId(int i) { 87 return 0; 88 } 89 90 @NonNull 91 @Override 92 public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 93 if(convertView == null) { 94 convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.currency_spinner, parent, false); 95 } 96 TextView nameView = convertView.findViewById(R.id.currency_name_textview); 97 ImageView symbolView = convertView.findViewById(R.id.currency_symbol); 98 Currency currency = Currency.values()[position]; 99 nameView.setText(currency.text); 100 symbolView.setImageResource(currency.drawableResId); 101 return convertView; 102 } 103 104 @Override 105 public View getDropDownView(int position, View convertView, ViewGroup parent) { 106 return getView(position, convertView, parent); 107 } 108 } 109 } 110 111 public static class MainFragment extends Fragment { 112 MainFragment() { 113 super(R.layout.fragment_main); 114 } 115 @Override 116 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 117 super.onViewCreated(view, savedInstanceState); 118 119 SharedPreferences pref = requireActivity().getSharedPreferences(PREF_CURRENCY_FILENAME, Context.MODE_PRIVATE); 120 Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)]; 121 122 EditText price = view.findViewById(R.id.enter_price); 123 price.setCompoundDrawablesRelativeWithIntrinsicBounds(currency.drawableResId, 0, 0, 0); 124 } 125 } 126}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 <Button 10 android:id="@+id/settingButton" 11 android:text="SETTING" 12 android:layout_width="0dp" 13 android:layout_height="wrap_content" 14 app:layout_constraintEnd_toStartOf="@id/mainButton" 15 app:layout_constraintStart_toStartOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17 <Button 18 android:id="@+id/mainButton" 19 android:text="MAIN" 20 android:layout_width="0dp" 21 android:layout_height="wrap_content" 22 app:layout_constraintEnd_toEndOf="parent" 23 app:layout_constraintStart_toEndOf="@id/settingButton" 24 app:layout_constraintTop_toTopOf="parent" /> 25 <FrameLayout 26 android:id="@+id/fragment_container" 27 android:layout_width="0dp" 28 android:layout_height="0dp" 29 app:layout_constraintBottom_toBottomOf="parent" 30 app:layout_constraintEnd_toEndOf="parent" 31 app:layout_constraintStart_toStartOf="parent" 32 app:layout_constraintTop_toBottomOf="@id/settingButton" /> 33</androidx.constraintlayout.widget.ConstraintLayout>

res/layout/fragment_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <EditText 11 android:id="@+id/enter_price" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:layout_marginTop="10dp" 15 android:ems="10" 16 android:hint="new_budget_tracker_price_hint" 17 android:inputType="number" 18 app:layout_constraintEnd_toEndOf="parent" 19 app:layout_constraintStart_toStartOf="parent" 20 app:layout_constraintTop_toTopOf="parent" 21 app:layout_constraintBottom_toBottomOf="parent" 22 android:drawableStart="@drawable/ic_japanese_yen" 23 android:paddingEnd="5dp" 24 android:drawablePadding="12dp" 25 tools:ignore="SpeakableTextPresentCheck" /> 26 27</androidx.constraintlayout.widget.ConstraintLayout>

res/layout/fragment_setting.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <Spinner 11 android:id="@+id/currency_spinner" 12 android:layout_width="0dp" 13 android:layout_height="wrap_content" 14 app:layout_constraintEnd_toEndOf="parent" 15 app:layout_constraintStart_toStartOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17</androidx.constraintlayout.widget.ConstraintLayout>

res/layout/currency_spinner.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content"> 7 <ImageView 8 android:id="@+id/currency_symbol" 9 android:layout_width="32dp" 10 android:layout_height="32dp" 11 app:layout_constraintStart_toStartOf="parent" 12 app:layout_constraintTop_toTopOf="parent" /> 13 <TextView 14 android:id="@+id/currency_name_textview" 15 android:layout_width="0dp" 16 android:layout_height="wrap_content" 17 android:text="currency_name" 18 app:layout_constraintBottom_toBottomOf="@id/currency_symbol" 19 app:layout_constraintEnd_toEndOf="parent" 20 app:layout_constraintStart_toEndOf="@id/currency_symbol" 21 app:layout_constraintTop_toTopOf="@id/currency_symbol" /> 22</androidx.constraintlayout.widget.ConstraintLayout>

投稿2022/06/05 13:56

編集2022/06/11 12:40
jimbe

総合スコア12543

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

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

Yakusugi

2022/06/07 09:46

ありがとうございます。 確かにSharedPreferencesを用いた所、String形式の文字列などは対応可能な様ですが、 VectorAsset等のアイコン形式のデータには対応していないようでした。 今回やりたいこととしては、$(ドルマーク)、€(ユーロマーク)をEditTextに表示したいのですが、 SharedPreferencesですと、それらのアイコンを扱えないようです。 もし、何か上記についての解決策があれば、共有頂けますと幸いです。 私の方でも継続して探してみます。
jimbe

2022/06/07 10:58

ちょっとイメージが違っているようですが、私としましては、 SharedPrefarences にはマークを示す別のモノ、例えば円なら 0, ドルなら 1, ユーロなら 2 といった値を保存し、それを if や switch 等で判断してアイコンデータを EditText に入れるというコードを作るということです。
Yakusugi

2022/06/10 05:46

上記、実際に作成までしていただき、ありがとうございます。 新たにCurrencyクラスとCurrencySpinnerAdapterクラスを記述しました。 上記ご回答の中で実装頂いた部分に関して、私のソースコードにも反映させようと思ったのですが、 作りこみがことなっていたため、private static final String PREF_CURRENCY_VALUE = "currencyValue";を参考にしてみました。 新たに記載したNewBudgetTrackerのgetSharedPreferences(受け取り箇所)も記載し、 受け取った数値を元に通貨記号を分岐形式で変更する仕様にしたのですが、記号すら変わらず、詰まってしまっております。
jimbe

2022/06/10 11:44

受け取りの箇所が何処に書いてあるのかが分かりませんが、Setting 後に実行されているのは確認されていますでしょうか。 実行されているとすれば、SharedPreferences に Setting で書き込んだ値が入っていましたでしょうか。
jimbe

2022/06/10 12:48

セッティング画面がラジオボタンとスピナーの違いでも結構大きそうでしたので、回答のコードを(追加頂いたコードに合わせる感じで)スピナーにしました。
Yakusugi

2022/06/11 00:54

ご回答誠にありがとうございます。 今回、例で示していただいたMainActivityの59行目の「Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)];」の部分ですが、 こちらの処理は、選択された通貨の番号(US Dollarなら0,Japanese Yenなら1, Euroなら2)を取得する認識で正しいでしょうか。 上記で書かれたCurrencyはenumとなっていたため、「Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)];」の部分を今回の私のプロジェクトに反映させせるのに苦戦しております。 ご提示頂いたプログラムを動かしてみた所、確かに通貨記号が変わり、アプリ再起動後も反映が残される事確できたのですが、数値を受け取ることで何故反映が残るのかが理解しきれておりません。 何度もやりとりをしてしまい、お手数おかけします。
jimbe

2022/06/11 06:14 編集

私のコードに関してのご質問であれば、何度もやりとりがあっても構いません。というより、不明な点を残したままでは役に立てないですよね^^; Currency ですが、 enum では問題があるでしょうか。 class でなければならなければ yakusugi さん実装のようなコードになると思いますが、私としましては定数的なデータは enum で実装することにしています。 ご質問とは関係ありませんので回答としては拘る必要はありませんが、どっちでも良ければ拘わる方に行ってしまうというか^^;;; > Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)]; これは、 SharedPreferences に保存してある通貨の番号(0/1/2)を取り出して、 Currency オブジェクト(USD/JPY/EURO)にしています。 enum の values() メソッドは、 定義されている全データの定義順の配列を返します。つまり new Currency[]{USD,JPY,EURO}; を返す感じです。 その配列から PREF_CURRENCY_VALUE の値をインデックスとして指定することでオブジェクトを得ています。 Yakusugi さんの Currency クラスでは getCurrencyArrayList() で全データの ArrayList を返していますが、それの配列版が values() です。 取得した currency は最後に > spinner.setSelection(currency.ordinal()); でスピナーの選択状態の設定に使用しています。 enum の ordinal() メソッドは、定義されているデータの並び順の番号を返します(0始まり)。 Yakusugi さんの Currency クラスの id に当たります。 つまり元を辿れば spinner.setSelection(pref.getInt(PREF_CURRENCY_VALUE, 0)); で済みますので、 > Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)]; をしなくて済むことではあります。 (MainFragment の取り出し部分をコピペしたのでこのようになっています。spinner 選択時は > editor.putInt(PREF_CURRENCY_VALUE, position); としていますので、どっちかに統一したほうが良いような気はしますが ^^;) P.S. 回答コードのアイコン名等を変更しましたのでそれに合わせてこの文を少し修正しました。
jimbe

2022/06/11 07:39

因みに enum Currency をクラスにすると以下のようなことになります。 (回答のほうに書くと混ざってしまうので、見辛いですがこちらに…) final class Currency { static final Currency USD = new Currency(0, "US Dollers", R.drawable.ic_money); static final Currency JPY = new Currency(1, "Japanese Yen", R.drawable.ic_yen); static final Currency EURO = new Currency(2, "Euro", R.drawable.ic_euro); private static final Currency[] values = { USD, JPY, EURO }; static Currency[] values() { return values; } private final int ordinal; final String text; final int drawableResId; private Currency(int ordinal, String text, int drawableResId) { this.ordinal = ordinal; this.text = text; this.drawableResId = drawableResId; } int ordinal() { return ordinal; } }
Yakusugi

2022/06/11 10:57

ご回答頂きありがとうございます。 上記でご回答頂いた通り、spinner.setSelection(pref.getInt(PREF_CURRENCY_VALUE, 0));を実装してみました。 その下でeditor.putInt(PREF_CURRENCY_VALUE, position);で、editorに挿入いたしました。 editor.putInt(PREF_CURRENCY_VALUE, position); そこから、受け取り側のクラス(HomeFragment)で受け取り方法の部分で詰まってしまいました。 上記、コードの方も更新したのですが、ご提示頂いたコードでは「Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)];」で受け取っているようですが、 これを私のプロジェクトに合わせると、どうなるのかがなかなか見いだせておりません。 下記の様な実装にはしてみたのですが、これだとやっている趣旨がずれてしまっているかと思います。 この場合、ご提示頂いたenum型のものに私のコードのCurrencyクラスを合わせる必要がありますでしょうか。 sharedPreferences = getActivity().getSharedPreferences(PREF_CURRENCY_FILENAME, 0); //選択された通貨の設定 String currentCurrency = sharedPreferences.getString("CURRENCY", ""); int currentCurrencyNum = sharedPreferences.getInt("PREF_CURRENCY_VALUE", 0); currentCurrencyTv.setText(currentCurrency); if (currentCurrencyNum == 0) { currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_money, 0, 0, 0); } else if (currentCurrencyNum == 1) { currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_yen, 0, 0, 0); } else if (currentCurrencyNum == 2) { currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_euro, 0, 0, 0); }
jimbe

2022/06/11 12:50 編集

私の Currency クラスは (enum 版でも class 版でも )drawableResId フィールドでアイコンのリソース ID は取得できますので、「Currency currency = Currency.values()[pref.getInt(PREF_CURRENCY_VALUE, 0)];」をすればその後「 if (currentCurrencyNum == 0) { ~」という if は必要ありません。というか、そのような if 文を作らなくて済むように Currency クラスを設計しています。 回答コードの MainFragment では Currency オブジェクトを取得したら後はそのオブジェクトのリソースIDをビューに設定しているだけですね。 Currency クラスを作らず " 通貨の番号 " だけで処理をするなら、あちこちに 0 だったら~、1だったら~という if 文や switch 文が出来ることになるでしょう。 その状態で「英ポンドも入れよう」等となったら、全ての if 文を修正することになり、修正しきれなければバグとして後に問題が発生することになります。 java はオブジェクト指向ですので、どのようなデータの纏まりをオブジェクト(クラス)として定義するかが設計の基本になります。 回答のコードでは、 Currency に英ポンドの定義を一行入れるだけで対応できます。 「いや、メソッド化すればそれほどアチコチには散らばらないし」とは言えますが、『扱う通貨の種類を増やすために Currency (通貨) クラスにデータを追加する』という説明と『扱う通貨の種類を増やす為に MainActivity の xxx メソッドと yyy メソッドに if 文を追加する』という説明ではどちらが「よりイメージが自然ぽい」かということも設計に関わると思います。 Yakusugi さんはご自身の Currency クラスをどう使うつもりで設計されましたでしょうか。 Currency クラスにはアイコンのリソース ID を取り出せる getCurrencyImage() メソッドを定義されていますので、 currentCurrencyNum (0~2) から Currency オブジェクトを得られれば if 文は必要無いはずですね。 また、 static メソッドである getCurrencyArrayList() は全通貨のリストを返します。 これらを組み合わせれば Currency currency = Currency.getCurrencyArrayList().get(currentCurrencyNum); によって Currency オブジェクトを得られ、 currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(currency.getCurrencyImage(), 0, 0, 0); でアイコンを設定できるものと思います。 currentCurrency も、わざわざ SharedPreferences から別途取得せずとも、 currency.getCurrency() で得られるのではないでしょうか。
jimbe

2022/06/11 12:36

上のコメントを書いていて今更気付きましたが、 setCompoundDrawablesWithIntrinsicBounds てリソース ID 指定のがあったんですね。drawable オブジェクト要らなかった…回答修正します。
Yakusugi

2022/06/12 01:01

ご回答ありがとうございます。 上記の通り、実装を試してみたのですが、HomeFragmentの126行目「Currency currency = Currency.getCurrencyArrayList().get(currentCurrencyNum);」の行でIndexOutOfBoundsExceptionエラーが派生してしまいました。 エラー内容は記載しました。 私の方でも、検証しているのですが、原因が掴めておりません。 何度もすみません。
jimbe

2022/06/12 02:40 編集

> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 となっていますので、ArrayList に値が入っていないようです。 Currency.getCurrencyArrayList() で 3 要素が入った List が返されているかを確認してください。 この場合 Currency クラスの static な作り方に問題があるということは確かに思います。 getCurrencyArrayList() メソッドが返すリストは、 initCurrencies() メソッドを実行しないと要素が入りません。 『何かを実行する為にはその前に何かをしなければならない』というのはもちろん仕様としてはアリですが、それを忘れる可能性は常にあり、そのような手順を踏まなくても済む方法があればそちらを選択するほうが良いと思います。 回答のコードは initCurrencies() のようなことをしなくても Currenct.values() が返す配列には値が入っているようにしています。 List(ArrayList) は配列のように static int[] a = new int[]{0,1,2}; といった初期化が出来ませんのでメソッドを使った初期化という形にされているのかもしれませんが、java には「 static {} 」という初期化の書き方があります。 "{}" の中には普通に処理を書くことが出来、 > private static ArrayList<Currency> currencyArrayList = new ArrayList<>(); の直後に static { initCurrencies(); } と書いておくと必要なタイミングで自動的に initCurrencies() が呼ばれますので、使う側で initCurrencies() を呼ぶ必要がありません。
Yakusugi

2022/06/12 02:59

ご回答ありがとうございます。 static { initCurrencies(); } 上記を記載した上で、Currencyクラスの66行目の「return currencyArrayList;」にブレークポイントを貼りました。 最初は、確かにcurrencyArrayListには何も入っていなかったのですが、 上記実装後は3つ入っている事確認出来ました(図2をご参照ください。) しかし、実際に動かしてみると、通貨が変わらないんですよね。。。 私の方でも継続して検証してみます。
jimbe

2022/06/12 03:43

確認ですが、 currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds の行を実行する時点で currency.getCurrencyImage() は " 変わるはずのリソースID " を (USD 表示中に JPY をセッティングしたとすれば ic_yen のリソース ID) 返しているのですね? setCompoundDrawablesWithIntrinsicBounds の動作がおかしいとなれば、こちらで再現するにはこちらの環境を出来るだけ Yakusugi さんの環境に近づけて再現しないと、(回答のコードで動作してしまっていますので)こちらで原因を探すのは難しいです。 HomeFragment のコードやレイアウト等、再現する一式をご提示頂くことは可能でしょうか。
Yakusugi

2022/06/12 04:19

はい、上記で仰られた通り、 currency.getCurrencyImage()によって、日本円を選択すれば、 ic_yen のリソース IDを返すはずです。 文字数制限のせいで、TeraTailにHomeFragment一式を掲載することが難しいので、 下記、GitHubにプッシュしたHomeFragmentのページからご確認頂けますでしょうか。 https://github.com/yakusugi/OfflineBudgetTrackerAppProject/blob/master/app/src/main/java/com/myproject/offlinebudgettrackerappproject/HomeFragment.java お手数おあけしますが、よろしくお願いいたします。
Yakusugi

2022/06/12 04:39

すみません。 先ほどの私の回答の中で語弊がありました。 HomeFragmentの128行目の「currentCurrencyTv.setCompoundDrawablesWithIntrinsicBounds(currency.getCurrencyImage(), 0, 0, 0);」でブレークポイントを貼り、確認してみたのですが、 currency.getCurrencyImage()が確実に選択された通貨記号を返しているかは確認出来ておりません。 継続して、こちらでも確認してみます。
jimbe

2022/06/12 05:19

HomeFragment.java の onCreateView 内で currentCurrencyNum の取得時に > int currentCurrencyNum = sharedPreferences.getInt("PREF_CURRENCY_VALUE", 0); と PREF_CURRENCY_VALUE が 「"」で囲まれてしまっています。 これでは currentCurrencyNum が常に 0 になってしまっているでしょう。
jimbe

2022/06/12 06:04 編集

見直してみれば、ご質問の受け取りの個所のコードで既に「"」で囲まれていますね。 思い込んでいるとなかなか見つからないものです(>< おつかれさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問