2016-10-15 3 views
1

私はこのすべてに慣れていますので、私はこのアプリを書くために始めました。Androidの断片では、音はonClickイベントの後に再生されません

このアプリはクリック可能な6つの画像から始まり、一連の「スワイプル」画面で構成された2次アクティビティにつながり、クリックしたときに音が鳴る画像が表示されます。ここで生成された画面に必要な二次及び断片コードのコードは次のとおり

SecondaryPage.java

import android.os.Bundle; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 

public class SecondaryPage extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Set the content of the activity to use the activity_main.xml layout file 
     setContentView(R.layout.secondary); 

     // Find the view pager that will allow the user to swipe between fragments 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 

     // Create an adapter that knows which fragment should be shown on each page 
     SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(getSupportFragmentManager()); 

     // Set the adapter onto the view pager 
     viewPager.setAdapter(adapter); 
    } 
} 

SimpleFragmentAdapter.java

AnimalsFragement.java(Croc()Camel()はを除いて、同一であります名前)

import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.Toast; 

import static com.example.testfrags.R.layout.animals; 

public class AnimalsFragment extends Fragment { 
    private ImageView imageView; 
    private MediaPlayer mp; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = null; 
     //Inflating View to access it's resources 

     v = inflater.inflate(animals, container, false); 
     Log.i("AnimalsFragment", "mp before playing: " + mp); 

     //creating clickable image 

     imageView = (ImageView) v.findViewById(R.id.jungle_animals); 

     // Sound played once clicked 
     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Start playback. 
       mp = MediaPlayer.create(getActivity(), R.raw.lioncub2); 
       Log.i("AnimalsFragment", "mp: " + mp); 
       mp.start(); 
       mp.stop();//Stops playback - added precaution 

       // release media resources 
       releaseMediaPlayer(); 
       Log.i("AnimalsFragment", "mp after release: " + mp); 
       // Little msg confirm end of sound 
       Toast.makeText(v.getContext(), "Questo era il Leoncino", Toast.LENGTH_SHORT).show(); 

      } 
     }); 

     return v; 
    } // end of onCreatView 

    /** 
    * Clean up the media player by releasing its resources. 
    */ 
    private void releaseMediaPlayer() { 
     // If the media player is not null, then it may be currently playing a sound. 
     if (mp != null) { 
      // Regardless of the current state of the media player, release its resources 
      // because we no longer need it. 
      mp.reset(); 
      mp.release(); 

      // Set the media player back to null. 

     } // end of if 
    } // end of releaseMediaPlayer 

    @Override 
    public void onStop() { 
     super.onStop(); // Always call the superclass method first 
     releaseMediaPlayer(); 

    } 


} 

これらはxmlファイルです。 秒

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

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

animals.xml(croc.xmlとcamel.xmlが同じである)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:gravity="center"> 

    <ImageView 
     android:id="@+id/jungle_animals" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:src="@drawable/lion"/> 

</LinearLayout> 

ondary.xmlアプリのコンパイルおよび実行されますが、私は何も音がでない任意のフラグメントに任意の画像をクリックすると演奏された。私は私のデバイスでエミュレートしたが、何も試していない。

どうしたのですか?私はラインでv.getContext()getActivity()を変更しようとしている

`mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);` 

が、何も変わりません。 すべてのサウンドファイルはmp3です。私は、mp3ファイルが正常に動作し、正常に再生されているかどうかを確認するために、3つの画像を含むフラグメントを除いたsecondaryPage.javaのバージョンも作成しました。 また、メソッドが機能しているかどうかを確認するために、Toastというメッセージを挿入しました。 デバッグしてmp = MediaPlayer.create(getActivity(), R.raw.lioncub2);行に進み、続行するとサウンドが再生されます。任意の助けを事前に

10-15 10:50:36.962 2459-2459/com.example.testfrags I/Croc: mp before playing: null 
10-15 10:50:37.682 2459-2459/com.example.testfrags I/Choreographer: Skipped 36 frames! The application may be doing too much work on its main thread. 
10-15 10:50:39.472 2459-2459/com.example.testfrags I/AnimalsFragment: mp: [email protected] 
10-15 10:50:39.482 2459-2459/com.example.testfrags I/AnimalsFragment: mp after release: null 

ありがとう:

はここLog.i文の出力であります!

答えて

0

それは価値があるのです.... 実際にサウンドが終了する前に、コードの不具合がreleaseMediaPlayerメソッドを呼び出すことにありました。 だから私はMediaPlayer.OnCompletionListenerを使って何らかのコントロールを追加してこれをチェックしたはずです。

私は、変数を定義し、MediaPalyer.OnCompletionListnerを呼び出すことによってこれをしなかった:

private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     // Now that the sound file has finished playing, release the media player resources. 
     releaseMediaPlayer(); 
    } 

、その後、サウンドの再生が開始した直後に、次の呼び出しによって:すべての

mp.setOnCompletionListener(mCompletionListener); 

感謝を!

1

あなたが問題になっているのは、メディアプレイヤーを起動した直後に停止して解放しているということです。コードからstopメソッドを削除すると、サウンドが再生されます。

そして今、ちょうどあなたの音や音声が期間中に小さい場合MediaPlayer

の周りに多くの作業を必要とするため、停止はあなたがMediaPlayerクラスを使用したい場合は、今いくつかの作業を行う必要がありますあなたの全体の問題を解決することはできません削除SoundPoolクラスを使用する必要があります。

あなたの問題は私が先に回答したこの質問に似ているようです。Activityクラスで

宣言mediaPlayer断片を保持し、ちょうどMainActivityのを追加するには、フラグメントで今TabLayout.OnTabSelectedListener

... MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener{... 
    MediaPlayer mediaPlayer = null; 
    .... 
@Override 
public void onTabSelected(TabLayout.Tab tab) 
{ 
int position= tab.getPosition(); 
switch(position) 
    { 
    case 1: if(mediaPlayer!=null) 
      { 
      mediaPlayer.stop(); 
      mediaPlayer.realse(); 
      } 
    break; 
    case 2: if(mediaPlayer!=null) 
      { 
      mediaPlayer.stop(); 
      mediaPlayer.realse(); 
      } 
    break; 
    .... 
    } 
.... 
} 

を実装:link

あなたの問題を解決するために:

ソリューション1このような参照:

public class AnimalsFragment extends Fragment { 
private ImageView imageView; 
private MainActivity mainActivity; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = null; 
    mainActivity=(MainActivity)getActivity(); 
    .... 
    .... 
    imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Start playback. 
      mainActivity.mediaPlayer=MediaPlayer.create(mainActivity, R.raw.song); 
      mediaPlayer.start(); 

      .... 
      .... 
     ....} 

これがうまくいくことを願っています。

+0

ありがとうございました。私はstopメソッドを削除しましたが、何も変わりませんでした。以前のMediaPlayer(フラグメントコーディングなし)はファイルの再生に問題がなかったので、なぜ今は動作していないのか分かりません。 – BletchleyP

+0

私はあなたが最初に答えを与えるでしょう、彼らは短くて長い再生されたいオーディオのタイプを教えてください? –

+0

それはあなたにとても親切です。オーディオファイルはmp3ファイルの動物の音です。長すぎないようにしてください。 – BletchleyP

関連する問題