0

onTouchプログラムにイベントを実装しようとしていますが、機能していません。私は簡単な方法でそれをやっていますが、それは起こっていません。私のコードは次のとおりです。

    public class VideosActivity extends Activity {
    ImageView image;
    FirstView fview;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.videos_layout);
        //image = (ImageView)findViewById(R.id.imageView1);
       fview = new FirstView(this);
       setContentView(fview);
    }
     public class FirstView extends View implements OnTouchListener{

        public FirstView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            image = (ImageView)findViewById(R.id.imageView1);
            image.setOnTouchListener(this);
        }


         public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        image.setImageResource(R.drawable.dna2);
        return false;
    }
}
}

私のプログラムでは、次のエラーが表示されています。私のスタックはここに貼り付けられています...

    05-02 12:43:02.255: E/AndroidRuntime(358): FATAL EXCEPTION: main
05-02 12:43:02.255: E/AndroidRuntime(358): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidtablayout/com.example.androidtablayout.VideosActivity}: java.lang.NullPointerException
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.widget.TabHost.setCurrentTab(TabHost.java:323)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:129)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:453)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.view.View.performClick(View.java:2408)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.view.View$PerformClick.run(View.java:8816)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.os.Handler.handleCallback(Handler.java:587)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.os.Looper.loop(Looper.java:123)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-02 12:43:02.255: E/AndroidRuntime(358):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 12:43:02.255: E/AndroidRuntime(358):  at java.lang.reflect.Method.invoke(Method.java:521)
05-02 12:43:02.255: E/AndroidRuntime(358):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-02 12:43:02.255: E/AndroidRuntime(358):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-02 12:43:02.255: E/AndroidRuntime(358):  at dalvik.system.NativeStart.main(Native Method)
05-02 12:43:02.255: E/AndroidRuntime(358): Caused by: java.lang.NullPointerException
05-02 12:43:02.255: E/AndroidRuntime(358):  at com.example.androidtablayout.VideosActivity$FirstView.<init>(VideosActivity.java:33)
05-02 12:43:02.255: E/AndroidRuntime(358):  at com.example.androidtablayout.VideosActivity.onCreate(VideosActivity.java:25)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-02 12:43:02.255: E/AndroidRuntime(358):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-02 12:43:02.255: E/AndroidRuntime(358):  ... 18 more
05-02 13:23:21.845: E/AndroidRuntime(515): FATAL EXCEPTION: main
05-02 13:23:21.845: E/AndroidRuntime(515): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidtablayout/com.example.androidtablayout.VideosActivity}: java.lang.NullPointerException
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.widget.TabHost.setCurrentTab(TabHost.java:323)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:129)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:453)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.view.View.performClick(View.java:2408)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.view.View$PerformClick.run(View.java:8816)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.os.Handler.handleCallback(Handler.java:587)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.os.Looper.loop(Looper.java:123)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-02 13:23:21.845: E/AndroidRuntime(515):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 13:23:21.845: E/AndroidRuntime(515):  at java.lang.reflect.Method.invoke(Method.java:521)
05-02 13:23:21.845: E/AndroidRuntime(515):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-02 13:23:21.845: E/AndroidRuntime(515):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-02 13:23:21.845: E/AndroidRuntime(515):  at dalvik.system.NativeStart.main(Native Method)
05-02 13:23:21.845: E/AndroidRuntime(515): Caused by: java.lang.NullPointerException
05-02 13:23:21.845: E/AndroidRuntime(515):  at com.example.androidtablayout.VideosActivity$FirstView.<init>(VideosActivity.java:35)
05-02 13:23:21.845: E/AndroidRuntime(515):  at com.example.androidtablayout.VideosActivity.onCreate(VideosActivity.java:26)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-02 13:23:21.845: E/AndroidRuntime(515):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-02 13:23:21.845: E/AndroidRuntime(515):  ... 18 more

私のxmlファイルは次のとおりです...

<TableLayout
      android:id="@+id/tableLayout1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" >

      <TableRow
          android:id="@+id/tableRow1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" >
          <TextView android:text="pic on click which will tell where is the dna located in human body or cell "
            android:padding="15dip"
            android:textSize="18dip"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
      </TableRow>

      <TableRow
          android:id="@+id/tableRow2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" >

          <ImageView
              android:id="@+id/imageView1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:src="@drawable/dna1" />

      </TableRow>
  </TableLayout>
4

4 に答える 4

1

imageコンストラクターで使用するオブジェクトにはFirstView有効なオブジェクトが割り当てられず、使用しようとするとNullPointerException. ImageViewがコメントアウト( )したレイアウトにある場合は、次のR.layout.videos_layoutようになります。

super.onCreate(savedInstanceState);
setContentView(R.layout.videos_layout);
image = (ImageView) findViewById(R.id.the_id_of_the_imageview_fromThe_layout);
fview = new FirstView(this);
setContentView(fview);

ImageViewそれ以外の場合は、参照に有効なオブジェクトを割り当てる必要がありimageます。

編集: 上記のコードは機能しますが、なぜあなたが置くことにしたのかわかりません:

image = (ImageView)findViewById(R.id.imageView1);

のコンストラクターでfview(これは再びスローNullPointerExceptionされます)。動作する正しいコードは次のとおりです。

//...
    public class VideosActivity extends Activity {
    ImageView image;
    FirstView fview;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.videos_layout);
        image = (ImageView)findViewById(R.id.imageView1);
        fview = new FirstView(this);
        setContentView(fview);
    }
     public class FirstView extends View implements OnTouchListener{

        public FirstView(Context context) {
            super(context);
            image.setOnTouchListener(this);
        }
//...

また、自分が何をしているのか理解していないと思います。自分が書いているコードを修正する必要があります。君は:

  • を持つレイアウトで contentView を設定しますImageView
  • 次に、を実装する単純なビューを構築しOnTouchListener、このビューのコンストラクターで、作成中のビューをImageView前のレイアウトのリスナーとして設定します (何をしようとしていますか?!?!)。
  • 最初のレイアウトをfview(空で、何も表示されません)に置き換えます。

fviewはアクティビティに表示される最終ビューであり、設定したリスナーは画面に表示されImageViewなくなったため役に立たないため、投稿したコードは空白ImageViewの画面を表示します。

もう一度、コードを改善することをお勧めします。

于 2012-05-02T07:23:01.220 に答える
0

最初に画像変数を初期化する必要があります。 image= (ImageView ) findViewById(R.id.imageview);

それから電話するfview = new FirstView(this);

于 2012-05-02T07:22:41.653 に答える
0

oncreate でこの行を使用してください。

image = (ImageView)findViewById(R.id.your_image_view_id);
于 2012-05-02T07:22:43.163 に答える
0

ここでは、fview という新しいビューを作成しますが、それを実装しないため、Java はそこに何があるかわかりません。

fview = new FirstView(this);
setContentView(fview);

その中に ImageView を使用してレイアウトを作成し (または作成したものを使用し)、そのレイアウトを使用する必要があるため、そこで画像を使用できます。画像がどこかに浮かんでいますが、ビューにはありません

また、あなたのイメージは作成されていません - それは null または悪い - いくつかのゴミです。このコードはめちゃくちゃで、うまくいきません。アクティビティ、レイアウト、その他の基本的な事柄について学ぶために、少なくとも Android ドキュメントの最初の章を読むことをお勧めします: http://developer.android.com/guide/index.html

于 2012-05-02T07:42:05.823 に答える