首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在触摸时更改网格视图中项目的背景色

在触摸时更改网格视图中项目的背景色
EN

Stack Overflow用户
提问于 2012-12-11 04:51:16
回答 2查看 7.4K关注 0票数 4

我有一个用textView元素填充的gridView布局。我有一个gridView的onTouch()实现,其中被触摸的单元格需要更改背景颜色。下面是我的代码,但它不能工作,当我进行触摸时,VM关闭。

代码语言:javascript
复制
gridView.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent me) {

            int action = me.getActionMasked();
            float currentXPosition = me.getX();
            float currentYPosition = me.getY();
            int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);

            // Change the color of the key pressed
            ((TextView) gridView.getItemAtPosition(position)).setBackgroundColor(Color.RED);
            return true;
    }
}

编辑: Logcat跟踪

代码语言:javascript
复制
12-10 15:34:28.081: E/InputEventReceiver(829): Exception dispatching input event.
12-10 15:34:28.081: E/MessageQueue-JNI(829): Exception in MessageQueue callback: handleReceiveCallback
12-10 15:34:28.221: E/MessageQueue-JNI(829): java.lang.ClassCastException: java.lang.String cannot be cast to android.widget.TextView
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.example.helloworld.GridViewActivity$1.onTouch(GridViewActivity.java:62)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.View.dispatchTouchEvent(View.java:7122)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.View.dispatchPointerEvent(View.java:7307)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.os.MessageQueue.nativePollOnce(Native Method)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.os.MessageQueue.next(MessageQueue.java:125)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.os.Looper.loop(Looper.java:124)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at android.app.ActivityThread.main(ActivityThread.java:4745)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at java.lang.reflect.Method.invoke(Method.java:511)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-10 15:34:28.221: E/MessageQueue-JNI(829):    at dalvik.system.NativeStart.main(Native Method)
12-10 15:34:28.263: D/AndroidRuntime(829): Shutting down VM
12-10 15:34:28.263: W/dalvikvm(829): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
12-10 15:34:28.362: E/AndroidRuntime(829): FATAL EXCEPTION: main
12-10 15:34:28.362: E/AndroidRuntime(829): java.lang.ClassCastException: java.lang.String cannot be cast to android.widget.TextView
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.example.helloworld.GridViewActivity$1.onTouch(GridViewActivity.java:62)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.View.dispatchTouchEvent(View.java:7122)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.View.dispatchPointerEvent(View.java:7307)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.os.MessageQueue.nativePollOnce(Native Method)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.os.MessageQueue.next(MessageQueue.java:125)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.os.Looper.loop(Looper.java:124)
12-10 15:34:28.362: E/AndroidRuntime(829):  at android.app.ActivityThread.main(ActivityThread.java:4745)
12-10 15:34:28.362: E/AndroidRuntime(829):  at java.lang.reflect.Method.invokeNative(Native Method)
12-10 15:34:28.362: E/AndroidRuntime(829):  at java.lang.reflect.Method.invoke(Method.java:511)
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-10 15:34:28.362: E/AndroidRuntime(829):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-10 15:34:28.362: E/AndroidRuntime(829):  at dalvik.system.NativeStart.main(Native Method)
EN

回答 2

Stack Overflow用户

发布于 2012-12-11 06:15:47

实际上,我想通了!

我在这里将TextView类型转换为错误的返回类型

代码语言:javascript
复制
((TextView) gridView.getItemAtPosition(position)).setBackgroundColor(Color.RED);

我真正需要的是方法getChildAt,而不是getItemAtPosition (它返回一个字符串)

代码语言:javascript
复制
String s = (String) gridView.getItemAtPosition(position);
TextView tv = (TextView) gridView.getChildAt(position);
tv.setBackgroundColor(Color.RED);
票数 2
EN

Stack Overflow用户

发布于 2012-12-11 05:05:28

请改用gridView.setOnItemClickListener。您还将在onItemClick方法中获得位置,而不必像现在这样计算它。

编辑我刚刚意识到你想要在项目仍然被按下的时候改变颜色。在这种情况下,我建议将适配器中项目的背景设置为可绘制的选择器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13808998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档