如何检查片段是否在ViewPager中可见?

问题描述 投票:0回答:1

首先,由于Android的更改或我的问题完全不同,因此stackoverflow上提供的所有解决方案都无法使用。

我想实现的目标-我想检测我的视图(例如-ThirdFragment)何时成为焦点并变为用户可见。另外,它应该检测用户何时从当前视图滑动到下一个视图或上一个视图。

我为什么要这样做? -好吧,我正在其中一个视图中创建媒体播放器,如示例片段代码所示,并且用户可以通过点击列表中的音乐来播放视图中列出的任何音乐,但是当用户滑动到下一个屏幕时,停止。

有什么问题? -问题是媒体播放器从视图切换后并没有立即停止播放,但是[***]如果我滑动两步,它会停止播放但不能干净地播放,它会在后台抖动。

我之前尝试过的内容-我已经尝试过此[[setUserVisibleHint,但由于已被废弃,因此无法正常工作。 onPause,onDetach,onStop均无法正常运行,如此处所述[***]]/*------Home ViewPager----- */ public class HomeFragment extends Fragment { private ViewPager viewPager; private String[] titles = {"First","Second","Third","Fourth"}; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView subtitle = getActivity().findViewById(R.id.toolbar_right_subtitle); subtitle.setText(titles[0]); return inflater.inflate(R.layout.fragment_home, container, false); } @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); /* pages */ viewPager = view.findViewById(R.id.interfaces); InterfaceAdapter interfacePagerAdapter = new InterfaceAdapter(getActivity().getSupportFragmentManager(),0); viewPager.setAdapter(interfacePagerAdapter); viewPager.setCurrentItem(0); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { TextView subtitle = getActivity().findViewById(R.id.toolbar_right_subtitle); subtitle.setText(titles[position]); } @Override public void onPageScrollStateChanged(int state) { } }); } }


    /*---------- My Fragment Adapter --------- */

    public class InterfaceAdapter extends FragmentStatePagerAdapter {

        public InterfaceAdapter(@NonNull FragmentManager fm, int behavior) {
            super(fm, behavior);
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return new FirstFragment();
                case 1:
                    return new SecondFragment();
                case 2:
                    return new ThirdFragment();
                case 3:
                    return new FourthFragment();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 4;
        }
    }


/*---------- One of my Fragment --------- */

public class ThirdFragment extends Fragment {

    //------Media Player ----------
    private MusicAdapter musicAdapter;
    private List<SongData> songsList;
    private ListView listView;
    private static MediaPlayer mediaPlayer;
    private Handler handler = new Handler();
    private Runnable runnable;
    private ImageView playButton, prevButton, nextButton;
    private SeekBar seekbarPayer;
    private TextView playerTime,songTitle;
    private int pos = 0;

    public ThirdFragment() {
        // Required empty public constructor
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        mediaPlayer = new MediaPlayer();
        getAllSongs();
        return inflater.inflate(R.layout.fragment_focus, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState); 

        //--------Music Player---------------
        mediaPlayer = new MediaPlayer();
        playButton = view.findViewById(R.id.playpause_player);
        prevButton = view.findViewById(R.id.prev_player);
        nextButton = view.findViewById(R.id.next_player);
        seekbarPayer = view.findViewById(R.id.seekbar_player);
        playerTime = view.findViewById(R.id.playertime);
        songTitle = view.findViewById(R.id.songname);
        songTitle.setSelected(true);

        songsList = new ArrayList<>();
        musicAdapter = new MusicAdapter(getActivity(), songsList);
        listView = view.findViewById(R.id.songList);
        listView.setAdapter(musicAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                pos = position;
                playMusicFile(songsList.get(position).getUri(),songsList.get(position).getTitle());
            }
        });

        //play or pause music
        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playPause();
            }
        });

        //next music
        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (pos < songsList.size() - 1) {
                    pos++;
                } else {
                    pos = 0;
                }
                playMusicFile(songsList.get(pos).getUri(),songsList.get(pos).getTitle());
            }
        });

        //next music
        prevButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (pos > 0) {
                    pos--;
                } else {
                    pos = songsList.size() - 1;
                }
                playMusicFile(songsList.get(pos).getUri(),songsList.get(pos).getTitle());
            }
        });
    } 

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState); 
    }

    @Override
    public void onStart() {
        super.onStart();
        getAllSongs();
        Log.d("SystemStatus","Start"); 
    } 

    @Override
    public void onResume() {
        super.onResume();
        getAllSongs();
        Log.d("SystemStatus","Resume"); 
    } 

    @Override
    public void onStop() {
        super.onStop();
        stopPlayer();
        Log.d("SystemStatus","Stop"); 
    }

    @Override
    public void onDetach() {
        super.onDetach();
        stopPlayer();
        Log.d("SystemStatus","Detach");
    }

    @Override
    public void onPause() {
        super.onPause();
        stopPlayer();
        Log.d("SystemStatus","Pause");   
    }

    //---Media Player-----

    private void getAllSongs() {
       /*
        * get all songs and add it into songlist
        */
    }

    private void playMusicFile(String filePath,final String title){
        if(mediaPlayer!=null) {
            mediaPlayer.reset();
            try {
                mediaPlayer.setDataSource(filePath);
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start(); 
                    }
                });
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) { 
                        stopPlayer();
                    }
                }); 
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } 

    private void playPause() {
        if (!mediaPlayer.isPlaying()) {
            mediaPlayer.start(); 
        }else {
            mediaPlayer.pause(); 
        }
    }

    private void stopPlayer() {
        if(mediaPlayer.isPlaying()){
            mediaPlayer.stop();
            mediaPlayer.reset(); 
        }
    } 

}
首先,由于Android的更改或我的问题完全不同,因此在stackoverflow上提供的所有解决方案都无法使用。我想实现的目标-我想检测我的视图何时(对于...
android android-viewpager fragment android-mediaplayer
1个回答
0
投票
您正在传递0作为行为,它对应于已弃用的BEHAVIOR_SET_USER_VISIBLE_HINT。通过使用该行为,当您的片段成为当前页面时,将用BEHAVIOR_SET_USER_VISIBLE_HINT调用setUserVisibleHint(),否则将不使用true来调用。

如果切换到未弃用的false,则仅当前页面将获得BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT。当页面更改时,该Fragment将获得对BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT的回调,而新活动的fragment将获得对onResume()的调用。

© www.soinside.com 2019 - 2024. All rights reserved.