2

そこで、スクロール可能なタブ + スワイプ ナビゲーションを備えたアプリを作成しています。すべてのタブのページで、別のオーディオ ファイルを再生したいと考えています。

以下は私のフラグメントの OnCreateView で、mediaplayer の初期化、FileDescriptor を含み、assets フォルダー内の a.mp3 という名前のオーディオ ファイルを再生しています。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main_dummy,
                container, false);


        ///Playing sound from here on 
             AssetFileDescriptor fda;
        MediaPlayer amp = new MediaPlayer();
        try {

            fda = getAssets().openFd("a.mp3");//// GIVES ERROR !
            amp.reset();
            amp.setDataSource(fda.getFileDescriptor());
            amp.prepare();
            amp.start();

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rootView;

    }
}

GetAssets() メソッドは、次のようなエラーを返します。

Cannot make a static reference to the non-static method getAssets() from the type ContextWrapper

ただし、FileDescriptor の宣言から最後の Catch ステートメントまでの同じコードは、通常の空のアクティビティの OnCreate で完全に機能します。ここでは機能していません。

これに対する解決策はありますか?

どうにかして getAssets() メソッドを静的にすることはできますか?

Fragment から音声ファイルにアクセスする他の方法はありますか?

(覚えておいてください、私の目標は、異なるタブの各画面で異なるオーディオ ファイルを再生することです。後でさらにオーディオ ファイルを追加します。少なくともこれを最初に機能させようとしています。)

助けてください:)

ありがとうございました !

4

3 に答える 3

8

Context オブジェクトを使用する必要があるため、この例では次を使用できます。

rootView.getContext().getAssets().openFd("a.mp3");

そうは言っても、ビュー階層がインスタンス化された後、onActivityCreatedまたはその後に、このコードを Fragment Lifecycle の後半に移動することをお勧めします。onStartこのコードを挿入onCreateViewすると、ユーザーへの UI の表示が遅延または遅くなる可能性があります。

これらの後のライフサイクル メソッドから、安全に呼び出すことができます。 getResources().getAssets().openFd("a.mp3");

于 2013-08-13T13:00:35.493 に答える
0

getAssets() を context.getAssets() に置き換えるだけです:)

于 2013-08-13T12:58:03.397 に答える