2016-12-05 4 views
1

У меня есть viewpager. Он имеет 3 страницы. Из действия я должен сыграть некоторый музыкальный файл, когда кнопка нажата на фрагмент. Во время игры несколько кнопок будут скрыты, и после того, как кнопка воспроизведения будет видна. Поэтому я использую делегат для связи между Activity и Fragment. Функция делегата запускается после окончания игры, но всегда возвращается к фрагменту no 0 или 2. Всегда пропускайте 1 фрагмент. Таким образом, он позволяет использовать кнопки 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

метод кнопки вызова не вызывается или кнопки не переключаются? где находятся кнопки в showButton()? –

+0

Эти кнопки инициализируются в onCreateView(). Там много кодов garbase, и я не упоминал об этом. Прости. –

ответ

1

Вы устанавливаете делегат в fragment.createView Вы также используете ViewPager для обработки фрагментов, которые обрабатывают их жизненный цикл. Поэтому каждый раз, когда пейджер создает новый фрагмент, ваш делегат в этом действии заменяется.

View pager and fragment lifecycle

Это показывает, как определить, какой фрагмент в настоящее время видно.

1

проблема заключается в обратном вызов должен быть фрагмент, как вы называете делегат. с объектом интерфейса вы вызываете метод вызова cqn в fragme t при нажатии, но этот метод должен быть реализован в действии. вы почти делаете иначе.

Смежные вопросы