• ベストアンサー

androidプログラムで行き詰りました。ご教授願

はじめまして、行き詰ってしまったので質問させてください。 XMLでレイアウト定義したsurfaceViewに コード生成したsurfaceviewサブクラスを読み込ませ操作させたいのですが、 http://sepiandroid.blog100.fc2.com/ こちらを参考にしました。 そのクラス内で onTouchEventイベントを使って操作を行いたいのですが、onTouchEventが呼ばれません。どのようにすれば、onTouchEventを機能させることができるのでしょうか。 ご教授ねがいます。 また、このサブクラス内ではgetWidth() getHeight()が取得できないのですが、打開策はありますでしょうか。;

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.3

フォーカスが取れるかどうかはisFocusableで得られますが、そういうことではないんですよね。今、フォーカスが当たっているか、ということが知りたい、ということでしょうか。だとすると、Viewの「hasFocus」が使えると思います。これはフォーカスが当たっていればtrue、なければfalseを返します。また「findFocus」は、現在、自身にフォーカスがあればそのViewインスタンスが、なければnullが返されます。

dellx1
質問者

お礼

テストプログラムを組んで確認してみました。ありがとうございます。 同じことをする為にいろいろな書き方があるので、androidコーディングの日本語辞書的なものが揃えばいいのですが。。 今回はお世話になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#161640
noname#161640
回答No.2

>そのやり方がよくわからなかったので、件のアドレスを参考に組み込んで見ました。 いえいえ、別に特別なやり方などありませんよ。普通の部品類の配置と全く同じです。<SurfeceView……>と書くタグの代わりに、<jp.hoge.MyHogeView……>というように自分で定義したクラスを指定するだけです。これで、そのままそのビューがレイアウトに配置されますよ。とりあえず、それでそのまま自作クラスを配置して確かめてみてください。

dellx1
質問者

お礼

ADKにおまけについてくるルナランダーゲームをいろいろ見ていて、そのようにすることは知ってたのですが、今回はじめて部分的に窓のように使うので、一番最初にやってみたのですが、なにをどうやってもclassが見つからないといエクセプションに悩まされ、件のurlを見つけ実装してみたのですが、 surfacevewをそのようにxmlで定義した領域にはめ込むには自作surfaceviewのコンストラクタにpublic MySurfaceView(Context context, AttributeSet attrs) このコンストラクタを選ばなければエラーになるということをルナランダーと見比べて気づきました。ontoucheventも受け取れています。ありがとうございました;。ついでにそのviewにフォーカスが当たっていることを確認するには、なにかメソッドがあるんでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
noname#161640
noname#161640
回答No.1

ちょっとよくわからないのですが、xmlにSurfaceViewを配置しておき、Activity起動時にサブクラスのインスタンスをそこに設定して表示させる、ということですか。素朴な疑問なんですが、なぜxmlに最初からSurfaceViewサブクラスを配置しておかないんでしょうか。そうすれば黙っていても独自定義したSurfaceViewが画面に表示されますが……。わざわざ後でインスタンスを組み込むのとの違いが理解できませんでした。 とりあえず、そういうトリッキーなやり方でなく、普通にxmlにそのSurfaceViewサブクラスを配置して、ちゃんと機能するかどうかを確認してみてはどうでしょう。それで動けば、組み込み方に問題があるとわかりますから。 onTouchEventは、そのままメソッドをオーバーライドすれば動くはずです。動かないとなると、メソッドのオーバーライドが正しく行われていないとかでしょう。念のため、setFoucusable(true)とrequestFocusを初期化の際に呼び出してみてください。これでフォーカスは受け取れていますか? ちゃんとフォーカス出来るなら、そのViewでイベントは取れるはずです。そのあたり、どこまできちんと機能しているか確認してみてください。 getWidth/getHeightですが、これはどこで呼び出していますか。コンストラクタ内ではなく、インスタンス生成が完了した後で呼び出せば正しく値を取得できると思いますが……。 とりあえず、インスタンスの組み込みにすべての原因があるという気もしますので、まずはxmlにそのままサブクラスを配置しての動作確認が先決でしょう。

dellx1
質問者

補足

>なぜxmlに最初からSurfaceViewサブクラスを配置しておかないんでしょうか。 そのやり方がよくわからなかったので、件のアドレスを参考に組み込んで見ました。 とりあえず件のアドレスのやり方で組み込むとそのserfaceviewの箇所に目的のクラスの中身を表示してくれます。getWidt()はコンストラクタ、run内 surfaceCreated surfaceChanged でためしにそれぞれやってますが、何も返されません。 surfaceChangedの引数にwidth heightが入ってくるのでそれを取得することで、その件に関しては解決しましたが、onTouchEventは機能しません。 setFocusable(true); requestFocus(); はこの質問をする以前にコンストラクタにくみこんで試していますがonTouchEventは機能しません。 フォーカスを受けてることを調べるにはどのようなメソッドがあるのでしょうか、そちらもお教え願います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • android javaについて質問です

    android javaについて質問です public class MailMotion extends Activity implements OnTouchListener, OnClickListener { private FrameLayout frameLayout01; private ImageView target; private Button trash; private int targetLocalX; private int targetLocalY; private int screenX; private int screenY; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.motion); frameLayout01 = (FrameLayout)findViewById(R.id.FrameLayout01); target = (ImageView)findViewById(R.drawable.toudai); target.setOnTouchListener(this); trash = (Button)findViewById(R.id.trash); trash.setOnClickListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { int x = (int)event.getRawX(); int y = (int)event.getRawY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: targetLocalX = target.getLeft(); targetLocalY = target.getTop(); screenX = x; screenY = y; break; case MotionEvent.ACTION_MOVE: int diffX = screenX - x; int diffY = screenY - y; targetLocalX -= diffX; targetLocalY -= diffY; target.layout(targetLocalX, targetLocalY, targetLocalX + target.getWidth(); targetLocalY + target.getHeight()); screenX = x; screenY = y; break; case MotionEvent.ACTION_UP: int trashLeft = trash.getLeft() + trash.getWidth()/2; int trashTop = trash.getTop() + trash.getHeight()/2; int targetRight = target.getLeft() + target.getWidth(); int targetBottom = target.getTop() + target.getHeight(); if (targetRight > trashLeft && targetBottom > trashTop) { frameLayout01.removeView(target); } break; } return true; } @Override public void onClick(View v) { int childCount = frameLayout01.getChildCount(); if(childCount == 1) { frameLayout01.addView(target); }}} 上記のものを起動させると、nullpointが出てきます 前回の質問をもとに、デバッグをしてみたのですが、touchonLisnerのところでエラーが起きました 勉強不足なので原因がよくわかっておりません 間違いを教えていただけないでしょうか? stringは <drawable name="custom_button">#ffff00</drawable> で設定して、おそらく大丈夫だと思います <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/FrameLayout01" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_weight="10" > <Button android:layout_gravity="bottom|right" android:layout_width="30dp" android:layout_height="30dp" android:id="@+id/trash" android:background="@drawable/custom_button"/> <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/aaaa" android:src="@drawable/aaa" android:layout_gravity="center" /> </FrameLayout>

    • ベストアンサー
    • Java
  • javaで、オブジェクトを生成しないとメソッドは使えないんですか?

    javaで、オブジェクトを生成しないとメソッドは使えないんですか? そのように習ったのですが、サブクラスのメソッド定義の中で、オブジェクトを生成せずにスーパークラスのメソッドを使える例(下に簡単に書きました)をみて、分からなくなってしまいました。 おしえてください、よろしくおねがいします。 ------------------------------- class superclass { method_a(){ ~~~~ } } --------------------------- class subclass { method_b(){ super.method_a(); }

    • ベストアンサー
    • Java
  • androidのintentの使い方

    // //問題:LISTを押すと、エラーが出る、Intentの問題ですか? // public class FirstActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) private static final String TAG ="[HelloWorld]"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);// スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.firstlayout);// レイアウト設定ファイルの指定 ListView listview = (ListView) findViewById(R.id.fruitlist); // ListViewオブジェクト取得 listview.setOnItemClickListener(new ListItemClickListener()); // ListViewオブジェクトにクリックリスナーを関連付け } // アイテムクリックリスナー定義 class ListItemClickListener implements OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// onItemClickメソッド(値選択時イベントハンドラ) ListView listview = (ListView) parent; // ListViewオブジェクト取得 String item = (String) listview.getItemAtPosition(position);// 選択された値取得 Log.d(item, TAG); Intent intent = new Intent(FirstActivity.this,SecondActivity.class);// インテントの生成(呼び出すクラスの指定) startActivity(intent);// 次のアクティビティの起動 } } } -------------------------------------------------------------------------- public class SecondActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.main);// レイアウト設定ファイルの指定 } }

    • ベストアンサー
    • Java
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • サブクラスからメインメソッドの値を参照するとき

    サブクラスからメインのメソッドを参照する時にメインプログラムが二重起動してしまってどうしたらいいのかわかりません。 プログラムは メインクラスが public class MainProg{ 初期定義など public MainProg() {    プログラム中身 } public String Month{ return A; } public static void main(String [] args) { new MainProg(); } } サブクラスが public class Transmission{        一部省略 MainProg main = new MainProg(); String Month = main.Month(); } このようになっているんですが メインクラスで使用している値をサブクラスで参照しようとしたときにメインクラスがもう一度呼び出されてしまいます。 どのようにしたらいろいろ操作してみたんですが、どうにも解決法がわかりません。 お願いします。

  • Android Live壁紙のアニメーション実装?

    現在Live壁紙を制作しております。  ・背景画像のスクロール機能  ・アニメーション は実装できましたが、次のステップでつまづいています <実装方法> holder.lockCanvas(); (1)ここで、背景画像を canvasを使ってdrawBitmap しています (2)ここで、アニメーション画像を canvasを使ってdrawBitmap しています holder.jnlockCanvas(); <現状> 次のステップとして、Androidにはアニメーション機能として Alpha / Rotate / Translate / Scale / Set / があるようなので、このアニメーション機能を上記(2)の代わりに アニメーションとして実装させようとしています 現在、制作中のライブ壁紙にActivityクラスを実装し まず、ここのonCreate()の中で setContentView(R.layout.main) を読み込んで、そこにアニメーション画像を定義し その画像がclickされると、R.anim.alphaAnimation で定義した アニメーション動作をさせてみようとしております しかし、思うようにいきません。 R.layout.mainでのレイアウトは表示されず、壁紙アプリの画像しか 見えておりません <問題として考えている点> 背景画像はThreadで流動的に動いています その上にXMLで定義される Alpha / Rotate / ・・・・ のアニメーションは使用するのは無理なのではないか? と考えています <質問> Live壁紙上で、 Alpha / Rotate / Translate / Scale / Set / アニメーションは実装可能でしょうか? もし、可能であればその方法を教えていただけますでしょうか? よろしくお願いします

  • Formロード時に生成するインスタンスを、他のイベント内でも共有したい。

    下記手順を踏んで作成したオブジェクトを、タイトルの通り他のイベント内でも共有したいと考えています。 1. Formロード時に、xmlファイルから400項目程度の内容を読み込む。 2. 1.で読み込んだ各内容を、クラスのフィールドに設定します。 このようにLoadイベントで生成したクラスを、他のイベント、例えば、Form画面に設定してあるボタンのクリック時にも使いたいのです。 このようなケースで、どのような方法を採るとよいでしょうか? 【この質問に関係はないかもしれませんが、 言語は、C#を使っています。】

  • Ruby言語に関して質問です。

    Rubyで、クラス定義の際の質問です。 通常 cattle= Class.new(); で引数がデフォルトの場合は、Objectクラスのサブクラス生成すると 公式のリファレンスに記述があります。 調べてみると上記コードの場合は,cattleという無名クラスと呼ばれるものになるそうです。 この無名クラスとはYUGUIさんのサイトにある http://yugui.jp/images/uploaded/20084013-metaclass.png 右端の列にあるメタクラスと呼ばれるものになるのでしょうか? (無名クラス と メタクラスは同義??) また上記URLの画像からメタクラスはClassクラスのインスタンスであるようです。 ただClass.newで実行される newというクラスメソッドってサブクラスを生成すると いうふうにリファレンスにありますがレシーバであるClassクラスのインスタンスを 返すという記述はありません。 ただ、おそらくメタクラスというのはClassクラスのインスタンスなのだとは思いますが、 この理由はなぜなのでしょうか? もう一点、p Cattle.class();と記述すると Classクラスが返ると思います。これはCattleクラスのClassクラスのインスタンスである ということになるのでしょうか? しかしながらYUGUIさんの画像ではCattleはメタクラスのインスタンスとなっています。 であれば、メタクラスを意味するのでしょうか? 公式リファレンスには、上記に書いたような関係はRubyを扱う際には特に問題ではないとありますが、気になっています。

    • ベストアンサー
    • Ruby
  • 【VC++】クラスの追加方法について

    VC++の操作方法についての質問です。 現在、VC++2005を用いて、MFCダイアログベースアプリケーションを作成しています。 クラスの追加方法についての質問ですが、 「クラスビュー」⇒「プロジェクト」で右クリック⇒「追加」⇒「クラス」でウィザードに従って追加すると、 ウィザード内で基本クラスをコンボボックスより選択しなければならず、 この方法で追加すると、選択した基本クラスを継承する形でクラスが自動生成され、クラスビューにマップと基本型が追加されます。 現在作成に当たって参照しているサンプルプログラムでは、新たにクラスが定義されているようですが、 マップと基本型は生成されておらず、基本クラスも定義されていないのです。 どのように操作すれば、サンプルのように基本クラスを定義せず、 マップと基本型も追加されずに、クラスを追加できるのでしょうか? また補足ですが、クラスを追加した後は、別の自分で定義した親クラスを継承させるようにコードを変更したいと思っております。 お分かりの方おられましたら、お手数ですがご教授お願い致します。

  • Visual-C#の event キーワードの「意義」が分かりません

    Visual-C#というものを初めて触っている者です。 フォーム上にボタン等のコントロールを配置して、ボタンをダブルクリックすると、イベントハンドラをユーザが記述するコード部分(partial class)が表示されてくるのですが(Form1.cs)、このpartial classの残りの、ユーザが編集する必要のないコードはForm1.Designer.cs内に自動生成されます。 このForm1.Designer.cs内に、たとえば this.Button1.Click += new System.EventHandler( this.Button1_Click );  ←(1) のようなコードが自動生成されているわけです。 ここで、Button1とはButtonクラスのオブジェクトであり、ClickとはButtonクラスの(Controlクラスから継承した)Clickイベントだということです。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.click(VS.85).aspx public event EventHandler Click  ←(2) ここで使用されているEventHandlerとは何かというと、delegateです。 http://msdn.microsoft.com/ja-jp/library/system.eventhandler.aspx public delegate void EventHandler(Object sender, EventArgs e)  ←(3) 「イベントとは、コンピュータ・プログラムの実行に際し、何らかのアクションが発生した際にプログラムに発信される信号(これをメッセージと呼んだりする)をいう。」(『ウィキペディア(Wikipedia)』) この「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型の変数として定義しているわけですが、(2)の中の「event」というキーワードの「意義」が分かりません。 Controlクラス定義内で(2)式のように、コントロールの「クリック」イベントを、「EventHandler」という名前のデリゲートクラス型の変数と定義するというのなら、それはそれで分かるのですが、なぜ更に「event」というキーワードを付ける必要があるのかが、よく分からないのです。