0

リフレクションの概念を使用して、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();
}
4

1 に答える 1

1

mFfwdButtonビューがインフレートされたときにのみインスタンス化されます。だからあなたはnullを取得しています。したがって、アクティビティがユーザーに表示されるまで使用できないと思います。mediacontroller が VideoView にアタッチされる前でも、変数を取得しようとしています

OnResume で遅延のあるランナブルを投稿してみる

于 2012-11-27T10:41:17.050 に答える