我在onTouch中使用GestureDetector进行了一项活动.在我的布局中,我还有一个实现onClickListener的视图.在Android ICS上,我在处理TouchEvent时遇到NullPointerException.这个错误的原因是什么?我看过几篇帖子说onClick和onTouch不能很好地结合在一起,但是当看到这个错误时,没有真正的原因解释或问题的真正解决方案.
这是代码:
public class FlipCardActivity extends Activity implements
View.OnClickListener, View.OnTouchListener {
protected GestureDetector gestureDetector;
protected class TouchSwipeListener extends GestureDetector.
SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// Calculate dx, gradient, velocity, etc
// Check for and discard unacceptable swipes
if (Math.abs(gradient) > SWIPE_MAX_GRADIENT || Math.abs(distance) <
SWIPE_MIN_DISTANCE || Math.abs(velocity) < SWIPE_MIN_VELOCITY)
return false;
// Determine whether it's a left or a right swipe …
Run Code Online (Sandbox Code Playgroud) Android设备配置更改(例如"将硬键盘滑回")将始终调用PhoneWindow.onConfigurationChanged()
,然后调用reopenMenu()
.这将导致当前正在运行的活动的菜单重新打开,以防它显示.
我在我的onPrepareOptionsMenu()
覆盖中实现了对我的菜单的锁定.用户每次想要查看菜单时都必须输入代码.我不希望再次要求用户输入代码,而菜单仍然因为配置更改而仍然处于运行状态.因此,我想知道,有什么方法可以检查当前前景活动的菜单是否已经显示?知道这一点,如果菜单已经启动,我可以绕过询问访问代码.
我的自定义解决方法的实现是用我自己的标志menuShowing
,这是我设置onPrepareOptionsMenu
和重置onOptionsItemSelected
和onKeyDown
如果单击后退按钮.
EDIT:
屏幕方向配置更改似乎不会触发此行为.然而,硬键盘滑动确实如此.
我正在开发一个Android应用程序,在那里我提供一些内置图像,并让用户可以选择从Web下载更多内容以在应用程序中使用.在我的应用程序的某个时刻,我在我的布局中查看ImageView,并想确定Drawable内部是内置资源还是我从Web下载到SD卡的图像.
有没有办法提取ImageView中使用的Drawable的URI?这样我就可以看到它是资源还是下载文件.
到目前为止,这是我的代码:
ImageView view = (ImageView) layout.findViewById(R.id.content_img);
Drawable image = view.getDrawable();
Run Code Online (Sandbox Code Playgroud)
更新:使用Barry Fruitman的建议,我将图像的URI直接存储在我的自定义ImageView中供以后使用.以下是我的实现:
public class MemoryImageView extends ImageView {
private String storedUri = null;
public MemoryImageView(Context context, String Uri) {
super(context);
}
public MemoryImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MemoryImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public String getStoredUri() {
return storedUri;
}
public void setStoredUri(String storedUri) {
this.storedUri = storedUri;
}
Run Code Online (Sandbox Code Playgroud)
}
用法如下:
MemoryImageView view = (MemoryImageView) layout.findViewById(R.id.content_img);
String img = …
Run Code Online (Sandbox Code Playgroud)