Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VideoView is not properly rendered after Dialog's keyboard disappeared

I simplified my problem to the smallest example when it can be reproduced.

So:

  • 1 activity with VideoView and ImageView.
  • After clicking on ImageView AlertDialog is showed.
  • AlertDialog have 1 EditText field.
  • I touch this EditText and standard Android keyboard is showed.
  • Close keyboard.
  • Close dialog.

Problem: VideoView's borders (black rectangle) were extended and thus ImageView is not showed anymore.

Any help is appreciated! Thanks.

BEFOREAFTER

Code:

MainActivity.java

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.VideoView;

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Activity act = this;
    final VideoView videoView = (VideoView) findViewById(R.id.videoView1);
    videoView.setVideoPath("/mnt/sdcard/s1ep01.mp4");
    videoView.requestFocus();
    findViewById(R.id.imageView1).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            AlertDialog.Builder builder = new AlertDialog.Builder(act);
            View view = LayoutInflater.from(act).inflate(R.layout.dialog, null);
            builder.setView(view);
            builder.setPositiveButton("Save translation", null);
            builder.setNegativeButton("Cancel", null);
            AlertDialog dialog = builder.create();
            dialog.show();
        }
    });
}
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<VideoView
    android:id="@+id/videoView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

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

</RelativeLayout>

dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>
like image 498
kolobok Avatar asked Jul 24 '13 11:07

kolobok


People also ask

What is VideoView?

In Android, VideoView is used to display a video file. It can load images from various sources (such as content providers or resources) taking care of computing its measurement from the video so that it can be used for any layout manager, providing display options such as scaling and tinting.

Which view class should be used to display video in Android?

Displays a video file. The VideoView class can load images from various sources (such as resources or content providers), takes care of computing its measurement from the video so that it can be used in any layout manager, and provides various display options such as scaling and tinting.


1 Answers

as a Temporary solution, i created a Runnable that makes the VideoView Invisible, then makes it Visible after 200 milli seconds :

// Hide the VideoView
videoLayout.setVisibility(View.INVISIBLE);

// create a handler to handle the delayed runnable request
new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {
        // After the 200 millis (which are passes as a second parameter to this postDelayed() method in the last line of the code, this handler will invoke the following method :

        // run on UI so you can set the Visibitity of the UI elements
        runOnUiThread(new Runnable() {
     @Override
            public void run() {videoLayout.setVisibility(View.VISIBLE);}    // make it visible again
 });
    }
}, 200);    // this is the second parameter which decides when this handler will run it's run() method

hope this temporary solution helps for now

call this methods when your keyboard is hiding, alike on ENTER key, or when you touch a certain view outside the keyboard to hide it ... but dont put it in the onTouchEvent() of the activity or in the onUserInteraction so not to keep flashing

like image 200
Ahmed Adel Ismail Avatar answered Oct 08 '22 10:10

Ahmed Adel Ismail