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

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

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

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

Android

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

Q&A

解決済

1回答

1523閲覧

Androidプログラムに関して質問です。

mop

総合スコア14

Java

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

Android

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

0グッド

0クリップ

投稿2015/01/09 00:41

Android・Javaプログラミングに関して質問です。

TextViewに配列の文字を表示させています。
その配列の文字をメソッドを用意して変更するのですが、TextViewの表示に変化がありません。何故でしょうか?

メインアクティビティで変数a、配列textを宣言、初期化しています。
String型の配列内の文字を表示する為のTextViewを用意しています。
textShow()メソッドを作ってTextViewに文字をセットしています。

lang

1public class MainActivity extends Activity{ 2 3String namae = "abc"; 4String[] text = {"こんにちは" + namae + "さん"}; 5private TextView textmessage; 6 7@Override 8protected void onCreate(Bundle savedInstanceState) { 9 10textmessage = (TextView) findViewById(R.id.textView1); 11textShow(); 12(省略) 13} 14 15public void textShow(){ 16 17textmessage.setText(text[0]); 18} 19} 20

このプログラムを実行すると、こんにちはabcさんと表示されますが、abcのところに人の名前等の入れたいと考えています。
例えば以下のようなメソッドを実行します。

lang

1public void textChange(){ 2namae = "自分"; 3}

textChange()メソッドをボタン等のOnClick()メソッドで呼び出して変数namaeの値を変更しようとしますが、こんにちはabcさんから変わりがありません。
これは、メモリに配列の値が用意された後その値に直接変更がなされない為だと考えるのですが、直接このヒープ領域に値を代入することは無理なのでしょうか?
配列は必ずプログラムに必要ですので配列を消したりする事は出来ません。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

namaeを書き換えても、"こんにちは" + namae + "さん"が自動的に計算され直される訳ではありません。
text[0] = "こんにちは" + namae + "さん"のようにして、書き換える必要があります。


(2015/01/09 12:48 のコメントに対する回答)

text[0] = "こんにちは" + namae + "さん"を実行した時にtext[0]に格納されるのは式ではなく、計算結果です。
それを再代入することによって再評価されるわけではありません。

再評価させるようにするには、ちょっとした仕掛けが必要です。

※もしかしたら、誰かがこれと同じようなライブラリーを作っているかもしれませんが、調べていません。

lang

1// ReactiveString.java 2public final class ReactiveString { 3 4 private final String formatString; 5 private ObjectReference valueHolder; 6 7 public ReactiveString(String formatString, ObjectReference initValue) { 8 this.formatString = formatString; 9 this.valueHolder = initValue; 10 } 11 12 @Override 13 public String toString() { 14 return String.format(formatString, valueHolder.value); 15 } 16 17} 18 19// ObjectReference.java 20public final class ObjectReference { 21 22 Object value; 23 24 public ObjectReference(Object value) { 25 this.value = value; 26 } 27 28} 29 30 31// 使い方 32 33ObjectReference ref = new ObjectReference("John"); 34ReactiveString[] texts = { // ちょっと修正:省略記法にしました 35 new ReactiveString("こんにちは、%sさん", ref), 36 new ReactiveString("さようなら、%sさん", ref) 37}; 38for (ReactiveString v : texts) { 39 System.out.println(v); 40 // こんにちは、Johnさん 41 // さようなら、Johnさん 42} 43ref.value = "Jane"; 44for (ReactiveString v : texts) { 45 System.out.println(v); 46 // こんにちは、Janeさん 47 // さようなら、Janeさん 48}

(追記)

初期化のところはこういう風にしても良いです。

lang

1// Java5以上8未満 2 3// (略) 4String[] textFormats = { "こんにちは%sさん", "さようなら%sさん" }; 5final int n = textFormats.length; 6ReactiveString[] texts = new ReactiveString[n]; 7for (int i = 0; i < n; i++) { 8 texts[i] = new ReactiveString(textFormats[i], ref); 9} 10// (略)

(2015/01/09 22:42 のコメントに対する回答)

「一つ一つnewしてReactiveString配列に要素を追加して、初期化している」というご質問の答えは、Yesです。

ご質問の意図とあっているかどうか分かりませんが、
実は、"こんにちは" + namae + "さん"というコードも、new StringBuilder("こんにちは").append().append("さん").toString()と書くのとほぼ同じ処理になります。(このような機能を、構文糖、もしくはシンタックスシュガーといいます。)

それと、再評価させるようにする必要が無い場合の方法も書いておきます。

lang

1 2 // (略) 3 4 String namae = "abc"; 5 String[] text = { "こんにちは%sさん", "さようなら%sさん" }; 6 private TextView textmessage; 7 8 // (略) 9 10 public void textShow() { 11 textmessage.setText(String.format(text[0], namae)); 12 } 13 14 // (略)

投稿2015/01/09 01:15

argius

総合スコア9388

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

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

mop

2015/01/09 03:48

簡潔な回答を有難う御座います。 質問は解決したのですが、一つお聞きしたいのですが宜しいでしょうか? text配列に膨大な量の要素がありまして、一つ一つに、text[0] = "こんにちは" + namae + "さん"を実行する方法以外に何か良い方法はありませんでしょうか? 例えば以下のメソッドなのですが、2次元なのですが実行しても上手くいきませんでした。 public void upDateText(){ for(int i = 0; i < text.length; i++){ for(int v = 0; v < text[i].length; v++){ text[i][v] = text[i][v]; } } }
mop

2015/01/09 13:42

コメントへの解答有難う御座います。質問以外への回答までご丁寧に感謝します。 自分の書きましたコードでは、 String[] text = {"こんにちは" + namae + "さん"}; という形で配列を初期化しています。 それと同様に ReactiveString[] texts = new ReactiveString[]{ new ReactiveString("こんにちは、%sさん", ref) }; という風に一つ一つnewしてReactiveString配列に要素を追加して、初期化していると考えて宜しいのでしょうか?
argius

2015/01/09 15:53

また少し長くなりましたので、回答欄に追記しました。 それと、元の質問の延長であれば、追加の質問でも問題ないと私は思います。
mop

2015/01/09 23:59

自分の作っているプログラムに組み込むには多少難があるのですが、そこは自分なりに試行錯誤したいと思います。 大変勉強になりましたので感謝しています。 解答ありがとう御座いました。
argius

2015/01/10 00:45

完全な解決ではなさそうですが、参考になったのでしたら良かったです。 がんばってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問