2016-12-05 11 views
1

私はビューページャーを持っています。 3ページあります。アクティビティからは、ボタンを押すと音楽ファイルを再生する必要があります。再生中に、いくつかのボタンが非表示になり、再生ボタンが表示されます。だから、私はデリゲートを使用して、アクティビティとフラグメントの間で通信します。デリゲート関数は、再生終了後に起動されますが、常にフラグメント番号0または2に戻ります。したがって、ページ1またはページ3のボタンは有効にしますが、ページ2は有効にしないでください。フラグメントとアクティビティは呼び出されましたが、可視性は変更されませんでした

(私の悪い英語のため申し訳ありませんが)

マイインタフェース:

PlayResult.java

public interface PlayResult { 
    void PlayCompleted(boolean output); 
} 

PlayActivity.java

public PlayResult playDelegate = null; 
void play() 
{ 
try 
     { 
      try { 
       if(mp != null && mp.isPlaying()) 
        mp.stop(); 
       mp = null; 
      } 
      catch (Exception ex){} 
      mp = MediaPlayer.create(PlayActivity.this, StaticClass.getAudioResourceId(fileName, PlayActivity.this)); 
      mp.start(); 
      mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mediaPlayer) { 
        try { 
         mp.stop(); 
         mp.release(); 
        } 
        catch (Exception ex){} 
        if(playingButton != null) 
        { 
         try { 
          Thread.sleep(1000); 
          playMusic(dm.audio, dm, null, showButton); 
         } 
         catch (Exception ex) 
         { 
          //Log.e("error thread", ex.getMessage()); 
         } 
        } 
        else 
        { 
         playDelegate.PlayCompleted(true); 
         //showButton(); 
        } 



       } 
      }); 
     } 
     catch (Exception ex){ //Log.e("error playing", ex.getMessage()+ ex.getCause()); 

     } 

} 

と私のフラグメントで

viewpager_fragment.java

PlayActivity playActivity; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      view = inflater.inflate((R.layout.viewpager_layout), container, false); 
      _context = view.getContext(); 

      imgButton1 = (ImageView) view.findViewById(R.id.imgButton1); 

      imgButton1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       playMusic(dm.b1audio, dm, imgButton1,imgButton1); 
      } 
      }); 
     imgButton2 = (ImageView) view.findViewById(R.id.imgButton2); 

     imgButton2.setOnClickListener(new View.OnClickListener() { 
     @Override 
       public void onClick(View v) { 
       playMusic(dm.b2audio, dm, imgButton2,imgButton2); 
      } 
     }); 

     img = (ImageView) view.findViewById(R.id.image); 
     img.setImageResource(StaticClass.getResourceId(dm.image, _context)); 


      btnMoveForward = (ImageView) view.findViewById(R.id.btnMoveForward); 
       playActivity = (PlayActivity) getActivity(); 
       playActivity.playDelegate = this; 


     } 



    private void showButton() 
     { 
      btnMoveBackward.setVisibility(View.VISIBLE); 
      btnMoveForward.setVisibility(View.VISIBLE); 
      btnHome.setVisibility(View.VISIBLE); 

      imgButton1.setVisibility(View.VISIBLE); 
      imgButton2.setVisibility(View.VISIBLE); 
      imgButton1.setEnabled(true); 
      imgButton2.setEnabled(true); 

     } 
    void playMusic(String fileName, final DataModel dm , final ImageView playingButton, final ImageView showButton) 
     { 
      hideButton(showButton); 
      playActivity.playMusic(fileName, dm, playingButton, showButton); 
     } 

     @Override 
     public void PlayCompleted(boolean output) { 

      showButton(); 
      Log.e("Play completed del", "from delegate"+ ", dm "+dm.pageno+ btnHome.getVisibility()); 
     } 
+1

show buttonメソッドが呼び出されていないか、ボタンが切り替えられていませんか? showButton()内のボタンはどこで初期化されていますか? –

+0

これらのボタンはonCreateView()で初期化されます。そこにたくさんのガーベースコードがあり、私はそれに言及しなかった。ごめんなさい。 –

答えて

1

デリゲートをfragment.createView に設定しています。また、ViewPagerを使用してライフサイクルを処理するフラグメントを処理しています。したがって、ページャが新しいフラグメントを作成するたびに、そのアクティビティ内のデリゲートが置き換えられます。

View pager and fragment lifecycle

これは、現在表示されている断片を把握する方法を示しています。

1

問題は、デリゲートを名前として、コールバックがフラグメントであるべきです。インターフェイスオブジェクトを使用すると、クリックするとメソッドが呼び出されますが、そのメソッドはアクティビティで実装する必要があります。あなたはほとんどそうしています。

関連する問題