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

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

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

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

Android

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

Android Studio

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

解決済

Android 他クラスから特定のアクティビティのメソッドを呼びたい

sekaikan_ozaki
sekaikan_ozaki

総合スコア65

Java

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

Android

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

Android Studio

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

2回答

0評価

1クリップ

9664閲覧

投稿2019/09/18 05:25

PCスペック
Windows10 HOME 64bit
メモリ 32GB
プロセッサ Intel Core i7-8700CPU 3.20GHz
Android Studio 3.4.1(最新ver)
デモ用端末(XPERIA OS:7.0 API 24)

androidでお絵描きアプリを作っています.
ネットの情報を参考に,開発を進めているのですが,どうしても解決しない問題があります.

タイトルのように,他クラスから特定のアクティビティのメソッドを呼べないところで詰まっています.

現状,下のコードのように,「アクティビティ画面」+「viewを継承したOekakiクラス」の2つで構成しています.

画面上で,指でなぞった部分が着色され,線が残るような挙動になっています.

ここで,スマホ画面から指を離した際に,MainActivityクラスで記述したインスタンスメソッドを呼ぶためには,OekakiクラスのタッチイベントのMotionEvent.ACTION_UPに,任意のコードを書けばよいのですが,そのためにはMainActivityクラスのインスタンスをnewし直さなければなりません.
しかし,MainActivityクラス内では,ほかにも色んな変数やインスタンスメソッドがあり,新しいMainActivityインスタンスを作ってしまうことで,変数の中身が空っぽになってしまい,都合が悪いです.

試したこと
OekakiクラスをMainActivityの内部クラスにしようとしました.が,レイアウトファイルと上手く紐づけすることができず,エラーが頻発してしまい,うまくいきませんでした・・・

新しくインスタンスを作らない方法で,MainActivityのメソッドを呼ぶ方法はありませんでしょうか?

↓MainActivity.java

java

public class MainActivity extends AppCompatActivity { private Oekaki oekaki; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); oekaki= findViewById(R.id.view); //その他記述あり }

↓Oekaki.java

java

public class Oekaki extends View { private Paint paint; private Path path; //====================================================================================== //-- コンストラクタ //====================================================================================== public Oekaki(Context context) { this(context, null); } //====================================================================================== //-- コンストラクタ //====================================================================================== //レイアウトファイルからビューを初期化 public Oekaki(Context context, AttributeSet attrs) { super(context, attrs); //-- 初期化 //- Path関連 path = new Path(); //- Paint関連 paint = new Paint(); paint.setColor(Color.argb(150, 255, 0, 255)); paint.setStyle(Paint.Style.STROKE);// 描画設定を'線'に設定 paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setAntiAlias(true);// アンチエイリアスの適応 paint.setStrokeWidth(80);// 線の太さ } //====================================================================================== //-- 描画メソッド //====================================================================================== @Override protected void onDraw(Canvas canvas) { canvas.drawPath(path, paint);// Pathの描画 } //====================================================================================== //-- タッチイベント //===================================================================================== @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN://- 画面をタッチしたとき path.moveTo(x, y);// 始点を設定 invalidate();// 再描画 break; case MotionEvent.ACTION_MOVE://- タッチしながら指をスライドさせたとき path.lineTo(x, y);// 移動先の追加 invalidate();// 再描画 break; case MotionEvent.ACTION_UP://- 画面から指を離したとき path.lineTo(x, y);// 移動先の追加 invalidate();// 再描画 ※ここでMainActivityのメソッドを呼びたい break; } return true; } //====================================================================================== //-- 削除メソッド //====================================================================================== public void clear(){ path.reset(); invalidate(); } }

↓activity.main.xml

xml

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/constraintLayout" tools:context=".MainActivity"> <view android:id="@+id/view" class="com.example.app.Oekaki" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android

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

Android Studio

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