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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

573閲覧

AndroidのActivity外からの表示変更について

KOGUMA

総合スコア24

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/04/23 06:20

編集2018/04/24 05:56

失礼します。今、AndroidStudioを使用しているのですが、AppCompatActivityを継承していない、単なるClassから任意のActivity内の画面をいじる(TextViewの内容を変更するとか)ことは可能なのでしょうか?
とりあえず、操作対象のActivityに

Java

1public class GameCoreActivity extends AppCompatActivity { 2protected void onCreate(Bundle savedInstanceState) { 3() 4 } 5public void textChange(String name, String input, String output) { 6 TextView name = findViewById(R.id.output); 7 name.setText(R.string.input); 8 } 9}

を作って指示を送りたいClassに

Java

1GameCoreActivity.textChange("test", "gamestart", "textView");

を作成したのですが、non-staticには代入できない、となってしまい実行出来ませんでした。
やはり、Activityの内部からでないとそのActivityの内容を変更することは不可能なのでしょうか?

追記
そもそもこのコードでは、Activity内でも動作しませんでした・・
やりたかったこととしては、まず、メインのアクティビティに

Java

1TextView game_core; 2String game_core_setview = getString(R.string.game_core, game.select); 3game_core.setText(game_core_setview);

こんな感じの処理があったとして、
R.id.xxxx R.string.yyyyの部分を変数にしておいて(対応するxmlは予め作成しておく)別のクラスから引数を入れて実行すれば表示内容が変更できる(コードを全て別のクラスに記述した所、getStringやfindViewByIdはアクティビティ内に記述しないとエラーが発生してしまいました)といったメソッドを作成したい、と言うものでした・・
やはり、アクティビティに関する処理は全てアクティビティ内に記述しないとエラーになってしまいますか?
(初心者のため、見当違いの質問をしていたらすいません・・)

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

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

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

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

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

fuzzball

2018/04/24 02:28

Acitivity内でも GameCoreActivity.textChange("test", "gamestart", "textView"); と書けば同じエラーがでるでしょ?
KOGUMA

2018/04/24 05:53

指摘通りエラーになってしまっていました・・まだ初心者でそもそも表示の部分から間違えていたみたいです。修正します
guest

回答1

0

ベストアンサー

2点ほど指摘します。

textChange()の内容が正しくない

Java

1public void textChange(String name, String input, String output) { 2 TextView name = findViewById(R.id.output); 3 name.setText(R.string.input); 4 }

質問のエラーとは関係ないですが、仮にActivity上で実行したとしても、この内容ではエラーが出るか正しく動作しないです。
それぞれの引数がどういう意味で用意しているのか、質問文から読み取れませんでしたが、以下の理由によりまったく使われていないです。

  • R.id.outputR.string.inputはxmlで事前に設定するものであり、これは引数であるoutputinputとは別物である
  • nameは処理中に同じ名前で再度定義されており、引数のnameは使われていない

仕様がわからないので、回答はできませんが、まずはこれを直すほうが先だと思います。

別のクラスからメソッドを呼び出す方法

ここではActivityなどを継承していないクラスから呼び出す方法を説明します。

Java

1GameCoreActivity.textChange("test", "gamestart", "textView");

上記のGameCoreActivityはクラスであり、言い換えれば「型」になります。
そして、変更したいactivityはインスタンス、要するに「型」から出来た「実体」です。
そのため、「実体」であるactivityを何かしらの方法で渡す必要があります。
具体例は以下のようになります。
(動作未確認なので、バグなどがあったらすいません)

Java

1public class GameCoreActivity extends AppCompatActivity { 2 protected void onCreate(Bundle savedInstanceState) { 3 () 4 5 Foo foo = new Foo(); 6 foo.setActivity(this); 7 } 8 public void textChange() { 9 () 10 } 11}

Java

1public class Foo { 2 private GameCoreActivity mActivity; 3 4 public void setActivity(GameCoreActivity activity) { 5 mActivity = activity; 6 } 7 8 // textChange()を呼び出すメソッド 9 public void callTextChange() { 10 mActivity.textChange(); 11 } 12}

投稿2018/04/24 01:23

fiveHundred

総合スコア9774

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

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

KOGUMA

2018/04/24 05:50

詳しい解説どうもありがとうございます! やりたかったこととしては、まず、メインのアクティビティに TextView game_core; String game_core_setview = getString(R.string.game_core, game.select); game_core.setText(game_core_setview); こんな感じの処理があったとして、 R.id.xxxx R.string.yyyyの部分を変数にしておいて(対応するxmlは予め作成しておく)別のクラスから引数を入れて実行すれば表示内容が変更できる(コードを全て別のクラスに記述した所、getStringやfindViewByIdはアクティビティ内に記述しないとエラーが発生してしまいました)といったメソッドを作成したい、と言うものでした・・ やはり、アクティビティに関する処理は全てアクティビティ内に記述しないとエラーになってしまいますか? (初心者のため、見当違いの質問をしていたらすいません・・)
fiveHundred

2018/04/24 07:01

言っていることはよく分かりませんが、 > R.id.xxxx R.string.yyyyの部分を変数にしておいて xmlを書き換えて変更するのが普通なので、たぶんできないですし、仮にできたとしても、望ましいものではないと私は思います。 普通にメンバ変数を定義するのがよろしいかと思います。 > (コードを全て別のクラスに記述した所、getStringやfindViewByIdはアクティビティ内に記述しないとエラーが発生してしまいました) getStringもfindViewByIdもpublicなメソッドなので、単に書き方が悪いだけかと思います。 (mActivityにActivityを代入してから)mActivity.getString(~);とすれば呼び出せると思いますがどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問