У меня есть приложения, которые я создал для работы с SDK 3.0.
В этом приложении есть относительная компоновка с полноэкранным VideoView с кнопкой под ней.Для просмотра видео установлен onTouchListener, который прослушивает жест.
После завершения видео VideoView
устанавливается на visibility(View.GONE)
На устройствах, работающих под управлением Honeycomb (Toshiba Thrive и HTC Flyer), эта функциякак я и ожидал.Когда VideoView
равно GONE
, кнопка отлично нажимается.
Однако на устройстве, работающем под управлением ICS (Motorola Xoom), когда я пытаюсь нажать кнопку, событие переходит к слушателю касания VideoView, а не к слушателю нажатия кнопок.
Был ли способ, которым представления, предназначенные для поведения в этой ситуации, преднамеренно изменился на ICS, или это ошибка?
Кроме того, первое, что я попытался решить, это также дало мне несколько странноерезультаты.
Я добавил эти строки вместо setVisibility(View.GONE);
Log.i(MainActivity.myTag, "vid is null ? " + (mVideoView == null));
Log.i(MainActivity.myTag, "lyt is null ? " + (vidLyt == null));
vidLyt.removeView(mVideoView); //This line throws null pointer
, думая, что если VideoView
будет удален из моего родительского макета, он определенно больше не будет принимать события касания.
но это вызывает нулевой указатель на вызов removeView ().Даже несмотря на то, что записи в журнале выше указывают на то, что оба объекта на самом деле не равны нулю.Вот исключение:
Насколько я могу судить, это на самом деле не указывает на какую-либо строку в моей деятельности, но эти 3 оператора - единственные 3, вызываемые в данный момент, и оба лога завершились успешно.
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): java.lang.NullPointerException
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2488)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.View.getDisplayList(View.java:10415)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.View.getDisplayList(View.java:10380)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.View.getDisplayList(View.java:10380)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.View.getDisplayList(View.java:10380)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:840)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.os.Looper.loop(Looper.java:137)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at android.app.ActivityThread.main(ActivityThread.java:4424)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at java.lang.reflect.Method.invokeNative(Native Method)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at java.lang.reflect.Method.invoke(Method.java:511)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-20 16:32:42.480: ERROR/AndroidRuntime(9416): at dalvik.system.NativeStart.main(Native Method)
РЕДАКТИРОВАТЬ: здесь соответствующие разделы.
mVideoView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent me){
if(me.getAction() == MotionEvent.ACTION_DOWN){
touchY = me.getY();
//I am using the if statement below to fix the unexpected behavior currently.
//by returning false even though the VideoView receives the touch, this
//causes it to essentiall ignore it and pass it along to the button.
if(mVideoView.getVisibility() == View.GONE){
return false;
}
}else if(me.getAction() == MotionEvent.ACTION_UP){
Log.i(MainActivity.myTag, "Old = " + touchY + " New = " + me.getY());
//Moved north a little is the gesture I am interested in.
if(me.getY() < (touchY - 100)){
Thread t = new Thread() {
public void run(){
timeStamp = mVideoView.getCurrentPosition();
mVideoView.stopPlayback();
//Since we are in back thread use a handler to GONEify the VideoView
animVidHandler.sendEmptyMessage(0);
//There is some network stuff here that justifies the use of a
//different thread. But I am certain it isn't affecting the
//behavior of my views.
}
};
t.start();
}
}
return true;
}
});
внутри обратного вызова обработчика есть только 1 оценка:
mVideoView.startAnimation(flyOffAnim); //translate animation to "fly off" the screen.
Я забыл упомянуть анимацию раньше.Может ли это быть как-то связано с этим поведением?
В flyOffAnimation установлен набор completeListener, который содержит только 1 оператор:
mVideoView.setVisibility(View.GONE);