1

I have a viewpager. It has 3 pages. From activity i have to play some music file when button pressed on fragment. During play, few button will be hide and after play button will be visible. So i use a delegate to communicate between Activity and Fragment. Delegate function fired after play finish but always return to fragment no 0 or 2. Always skip no 1 fragment. So either it enables page 1 or page 3 buttons but not page 2. Please help.

(Sorry for my bad English)

My Interface:

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());

        }

}

and in my fragment

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 method is not called or the buttons are not toggling? where are the buttons within showButton() initialized? – Suraj Rao Dec 05 '16 at 06:12
  • those buttons are initilized in onCreateView(). There is lots of garbase codes in there and i failed to mention it. sorry. – Tonmoy chowdhury Dec 05 '16 at 06:26

2 Answers2

1

problem is callback should be in fragment as you name delegate. with interface object you cqn call method in fragme t when you click, but that method should be implemeneted in activity. you are almost doing otherwise.

Vurgun M
  • 97
  • 1
  • 5
1

You are setting the delegate in fragment.createView You are also using ViewPager to handle the fragments which handles their lifecycle. So each time the pager creates a new fragment, your delegate in the activity is replaced.

View pager and fragment lifecycle

This shows how to figure out which fragment is currently visible.

Community
  • 1
  • 1
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103