ActivityとOnClick

396 views
Skip to first unread message

bocre...@yahoo.co.jp

unread,
May 27, 2012, 8:19:41 AM5/27/12
to 日本Androidの会
お世話になっています.

少しずつandroidについて学んで,現在SurfaceViewについて勉強しています.

onCreateメソッドを持ち,Activityを継承しているクラスとは別にクラスを用意して,SurfaceViewを継承,
SurfaceHolder.Callbackを実装しています.

勉強をしているうえでいくつか行き詰まってしまったためまとめて相談させていただきたく思います.
Activityを継承したクラスをA,SurfaceViewを継承したクラスをBと呼ばせていただきます.

1.クラスBでtoastやProgressDialogを使うとき,引数のcontextには何を入れたらいいのでしょうか.

2.main.xmlで,buttonのプロパティにあるOn Clickにクリック時のメソッドを宣言し,そのメソッドをクラスBに定義したところ
NoSuchMethodExceptionが発生しました.クラスAで定義すると問題なく動きました.
クラスAに定義しないと認識されないのでしょうか.On Clickでは以下のメソッドを呼び出しています.


public void onClickButton(View view){
TextView text = (TextView)findViewById(R.id.textView1);
text.setText("click_test");
}

3.現在クラスBで以下のようにしてカメラの画像を手に入れています(1回クリックするとcamera server diedとなりフリーズします
が).いくつかボタンを用意して,クリックしたボタンごとに異なる画像処理を施して,画面に表示するプログラムに書き換えるにはどうすればいいでしょう
か.
OnClickでやろうとしてつまずいてしまいました.
   @Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {

camera.takePicture(null,null,new Camera.PictureCallback(){
@Override
public void onPictureTaken(byte[] data, Camera camera) {

Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length,
null);

camera.startPreview();
}

});
}
return true;
}

分かりにくくて申し訳ありませんがよろしくお願い致します.
ついでですが,メッセージのはじめにアドレスではなく皆さんのように名前を表示するにはどうすればいいのでしょうか.

MORIHIRO

unread,
May 27, 2012, 8:58:29 AM5/27/12
to android-g...@googlegroups.com
SurfaceViewはActivityの置き換えになるようなものではなく、
大雑把に言ってしまえば、ButtonやTextViewなどと同類のものです。
→ 少なくとも、ActivityにsetContentView()する必要がある等々。

おそらくはその辺を勘違いして迷路にハマってしまっただけで、
SurfaceViewのサンプルコードはネット上でいくらでも見つかると思いますよ。


2012年5月27日日曜日 21時19分41秒 UTC+9 bocre...@yahoo.co.jp:

Androyer jp

unread,
May 27, 2012, 10:18:50 AM5/27/12
to android-g...@googlegroups.com
こんにちは。
ご質問の件は、ちょうど、私も学習中でした。

クラスBでtoastの引数には、SurfaceViewのコンストラクタで受け取ったContextを設定すればよろしいです。

ご質問の趣旨からすると、SurfaceView上の任意の点がクリックされたことを捕捉したいのだろうと思います。
しかし、「main.xmlで,buttonのプロパティにある」ということなので、
SurfaceViewとは別の領域にButtonを配置しているようにも思えますし、
RelativeLayout等を使ってSurfaceViewと同一領域にButtonを配置しているのかもしれません。

SurfaceView上の任意の点がクリックされたことを捕捉するJavaのコードは、SurfaceViewにおいて、次のようにしています。
Button classは使っていません。
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int iAction = event.getAction();
        switch(iAction){
        case MotionEvent.ACTION_DOWN:
            if(bButton==bButtonOff//ボタンが押されていない状態であって、かつ、、、
            && rButton.contains((int)event.getX(), (int)event.getY())==true){
                //ボタンが存在する範囲がクリックされた場合
                bButton = bButtonOn;//へこんだ画像にする。
                pText.setColor(0xffff0000);//文字を赤色にする。
                Log.d(TAG, "onTouchEvent : MotionEvent.ACTION_DOWN");
                
                //いちおう、Toastもやってみる。
                Toast.makeText(context, "Hello!", Toast.LENGTH_SHORT).show();
                return true;
            }
            break;
        }
        return super.onTouchEvent(event);
    }


2012年5月27日日曜日 21時19分41秒 UTC+9 bocre...@yahoo.co.jp:

bocre...@yahoo.co.jp

unread,
May 27, 2012, 12:06:31 PM5/27/12
to 日本Androidの会
早速の回答ありがとうございます.

無事クラスBでToastの表示ができました.
相変わらずcamera server diedがLogCatに表示されますが,これはPCのスペックの問題でしょうか.

またBuuton操作についてですが,
ButtonとSurfaceViewはRelativeLayoutでまとめて記述しているつもりです.
一番上にボタンが3つ横一列に並び,その下にtext,SiurfaceViewの画面の順で置いています.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1" >

<MySurfaceView //SurfaceViewのクラス
android:id="@+id/myview1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/textView1" >

<MySurfaceView>

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/button1"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button1"
android:onClick="onClickButton"/>

<Button
android:id="@+id/button2"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button2"
android:onClick="onClickButton"/>

<Button
android:id="@+id/button3"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.60"
android:text="@string/button3"
android:onClick="onClickButton"/>

</LinearLayout>


<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/linearLayout1"
android:text="TextView" />

</RelativeLayout>

最後にAndroyer jpさんのコードですが,恥ずかしながらbButtonやbButtonOnなどがわかりません.
Buttonクラスを使っていないというのは,Button btn = (Button)findViewById(id)などは使わずにできるとい
うことでしょうか.
contains()とあるのでrectangleを使っているのではないかと思いましたが,ON,OFFがわかりませんでした.
申し訳ありませんがもう少し詳しく教えていただけないでしょうか.
よろしくお願い致します.

Androyer jp

unread,
May 27, 2012, 2:10:56 PM5/27/12
to android-g...@googlegroups.com
こんにちは。

camera server diedの件は、わかりません。

xmlを拝見しますと、Buttonがクリックされると、その通知はActivityに行くので、Activity側で通知の受け取りを実装します。
Buttonのクリック通知を、SurfaceViewが直接受け取ることは、普通は行わないです。
xmlを拝見すると、Activityが受け取ればそれで十分であり、SurfaceViewにonClickButtonメソッドを実装する必要は無いでしょう。
Buttonのクリックにより、SurfaceViewの画像を変えたいのであれば、
Buttonのクリック>Activityで、クリックメッセージの受けとり>Activityで、SurfaceViewへの画像変更命令発行>SerfaceViewにおける画像変更
という流れになるかもしれません。

私のコードにおけるbButtonやbButtonOnはBitmapです。時間の経過とともに、これが大きくなったり小さくなったりします。
このようなものが無くても、画面に「ゲーム開始」と描いておけば良いですが、ゲーム目的なので動きを与えています。
Buttonクラスを使わず、Rectクラスで、SurfaceView上のクリックした場所の判定を行っています。
クリック判定はしますが、その後の振る舞いはActivityで行います。

「SurfaceView上の任意の点がクリックされたことを捕捉したいのだろう」と思ったため、参考に、私のコードを掲載しただけです。
xmlの開示があり、Buttonで処理をしようとのことですので、私のコードは無視して頂ければ良いです。


2012年5月28日月曜日 1時06分31秒 UTC+9 bocre...@yahoo.co.jp:

Androyer jp

unread,
May 27, 2012, 4:31:10 PM5/27/12
to android-g...@googlegroups.com
追加です。

camera server diedの件は、わかりませんが、カメラで撮った写真を取り扱うのであれば、そのファイルが存在するディレクトリから欲しい画像のファイル名を取得するのが良いかもしれません。

参考:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

2012年5月28日月曜日 3時10分56秒 UTC+9 Androyer jp:

bocre...@yahoo.co.jp

unread,
May 28, 2012, 9:39:08 AM5/28/12
to 日本Androidの会
お礼が遅くなり申し訳ありません.
詳しく説明していただきありがとうございます.

なぜOnclickがNullになるのかなど多くの疑問が解消されました.
SurfaceViewのクラスになんでも書こうとしていたので反省します.

また,サンプルコードの件,納得いたしました.今後の参考にさせていただきたいと思います.
本当にありがとうございました.
> ...
>
> もっと読む ≫
Reply all
Reply to author
Forward
0 new messages