リフレクションの概念を使用して、MediaController クラスに存在する FastForward ボタンの可視性を変更しようとしています。
以下は私のコードスニペットです。
package com.example.reflection;
import java.lang.reflect.Field;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class MainActivity extends Activity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Class <? > aClass;
try {
MediaController controller = new MediaController(this);
aClass = Class.forName("android.widget.MediaController");
Field forwardButton = aClass.getDeclaredField("mFfwdButton");
forwardButton.setAccessible(true);
NPE--->> ImageButton button = (ImageButton) forwardButton.get(controller);
if (null == button) Toast.makeText(this, "Button is null", Toast.LENGTH_LONG)
.show();
else button.setVisibility(View.INVISIBLE);
videoView = (VideoView) findViewById(R.id.videoView);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/Video/NeYo.flv");
videoView.setMediaController(controller);
videoView.requestFocus();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
ImageButton のフェッチ中に NullPointerException が発生します。
誰かが私が犯しているエラーを指摘できますか?
ありがとう
とにかく、私はこの質問に対する答えを得ました。
mFfwdButton は、View がインフレートされている場合にのみインスタンス化されます。それが私がnullを取得していた理由です。MediaController が VideoView にアタッチされる前でも、変数を取得しようとしていました。
私は次のアプローチに従いましたが、うまくいきました.本番環境ではベストプラクティスではないかもしれませんが、以下のスニペットはうまくいきました.
@Override
protected void onResume() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
ImageButton button;
try {
button = (ImageButton) forwardButton.get(controller);
if (null == button) Toast.makeText(MainActivity.this, "Button is null",
Toast.LENGTH_LONG).show();
else button.setVisibility(View.INVISIBLE);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 50);
super.onResume();
}