初めて作ったandroidアプリにfinish();を追加したいのですが、subクラスに追記するとエラーになります、教えて!

835 views
Skip to first unread message

yy山t

unread,
Jul 31, 2014, 9:32:12 PM7/31/14
to android-g...@googlegroups.com
本のサンプルを参考にアプリ作ったのですが、終了ボタン画像箇所をタップすると終了さすためにfinish();を追加したいのですが、
MainActivity.javaからGameView.javaクラスで画像表示、タップ判断等しているのですが、MainActivityにはfinish();を追加できるのですが、
本来追加したいGameViewに追記するとエラーになります(メソッドfinish();は型で未定義です)
ググって次も試しましたがcontextを変数にできません、とエラーです
Activity a = (Activity)context;
   a.finish();
基本がわかってない部分ありますが、対策おしえて下さい。

kenji matsuoka

unread,
Aug 1, 2014, 1:35:28 AM8/1/14
to android-g...@googlegroups.com
GameViewにcontextを渡していないんですよね

投げやりで申し訳ないですが、Android以前にJavaの基本的な書式についてご存じないように思われます。
急がばまわれ、Javaの入門書を買われることをおすすめします。

もし、AndroidもJavaも同時に学ばれたいと思うのであれば
「はじめてのAndroidアプリプログラミング」という書籍をおすすめします。

2014年8月1日金曜日 10時32分12秒 UTC+9 yy山t:

yy山t

unread,
Aug 1, 2014, 2:38:57 AM8/1/14
to android-g...@googlegroups.com
本紹介いただきありがとうございます。
contextが関連しているんですね、 GameViewクラスの最初のメソッドで
 public GameView(Context context) {
    super(context);  しているんですが、 その後
  @Override
  //■■■ タッチイベント時に実行されるメソッド ■■■
  public boolean onTouchEvent(MotionEvent me){
で処理選択して
 @SuppressLint("DrawAllocation")
 @Override
  public void onDraw(Canvas canvas) {
で画像表示関係の処理をしているんですが
投稿前にcontext関連かな、とは思いながら
 GameView(Context context) の中ではfinish();できそうなのは判ったんですが、

onDraw(Canvas canvas)以下ではエラーが出てしまうので、
下のようにしても ご指摘のように基礎が判ってないので対応に困ってます。


 @Override
  public void onDraw(Canvas canvas,Context context) {
....

Activity a = (Activity)context;
a.finish();
ちょこちょこ勉強してるんですが、はまると前にすすめなくて困ってます。
 

2014年8月1日金曜日 10時32分12秒 UTC+9 yy山t:

天然パーマ

unread,
Aug 1, 2014, 3:43:09 AM8/1/14
to android-g...@googlegroups.com
天然パーマと申します。

動作確認していませんが
親クラス名.this.finish(); では駄目でしょうか?

sample: MainActivity.java  --------------
public class MainActivity extends Activity {
    // ・・・・・・・・略
    class GameView(Context context) {
        //・・・・・・・・略
        
        public clickButton() {  
            MainActivity.this.finish();   // ← finish
        }
    }
}

2014年8月1日金曜日 15時38分57秒 UTC+9 yy山t:

yy山t

unread,
Aug 1, 2014, 8:37:50 AM8/1/14
to android-g...@googlegroups.com
天然パーマさん回答ありがとうございます。
MainActivity.this.finish();とすると
スコープ内で型MainActivityのエンクロージングインスタンスがアクセス不可 というエラーが。。。
MainActivity.javaとGameView.javaという感じで2つ以上の ~.javaですのでちょっと感じがちがうのかも。
また、よろしくお願いします。

2014年8月1日金曜日 10時32分12秒 UTC+9 yy山t:

kenji matsuoka

unread,
Aug 1, 2014, 11:57:39 PM8/1/14
to android-g...@googlegroups.com
サブクラスというか、別クラスなんですよね
finishはMainActivityのインスタンスが持っているメソッドなのでGameViewでは使えません。
GameViewからfinishを呼び出すにはMainActivityのインスタンスを経由してfinishを呼ぶ必要があります。
天然パーマさんのようにstaticでないインナークラスを使用した場合、インナークラスは暗黙でアウタークラスのインスタンス(この場合MainActivity)を持つので呼べるというわけです。
別クラスに分けた場合はコンストラクターなどでMainActivityを渡して、GameViewインスタンス変数として保持しておく必要があります。(あるいはGameView内のfinishを呼びたいメソッドのパラメータとしてください)
この辺りはJavaの基本的な文法の話で、最初に理解しておく必要があるため、Androidを勉強する前に軽く入門書で流れを掴んでいくことをおすすめします。
(Androidと混ぜてやると覚えないといけないことが沢山一度に出てきてしまうため)

2014年8月1日金曜日 21時37分50秒 UTC+9 yy山t:

yy山t

unread,
Aug 2, 2014, 8:40:15 AM8/2/14
to android-g...@googlegroups.com
 
 
起動繰り返しのときのメモリーリーク解決したくて、自分でググって、
解決できなかったので、ここ探しておじゃましました。
基本がわかってないのは自覚しているのでjava本も見たりしてるんですが、
知りたいことが目にはいらず、if文の書き方わかっていることが大半なので...
良い本探して基本から勉強してみます。
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages