我正在尝试克隆TikTok应用。对于主屏幕,我制作了一个VerticalViewPager(自定义视图寻呼机),并带有类似的按钮,标题和注释。我正在从Firebase检索视频。 TikTok模型具有视频URL,标题名称和喜欢的次数。问题是当我尝试转到下一个视频时,上一个视频仍在播放背景。我试图销毁该片段,但似乎无法正常工作。
这是我的HomeActivity.java
public class HomeActivity extends AppCompatActivity {
private VerticalPageViewer viewPager;
private ViewPageAdapter viewPageAdapter;
private List<TikTokModel> tikTokModels;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
viewPager = findViewById(R.id.viewPager);
tikTokModels = new ArrayList<>();
FirebaseFirestore.getInstance().collection("TikTok")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
tikTokModels.clear();
if(task.isSuccessful()){
for(QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()){
tikTokModels.add(queryDocumentSnapshot.toObject(TikTokModel.class));
}
Log.d("TEST", "onComplete: "+tikTokModels.get(0).getTitle());
viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager(),tikTokModels);
viewPager.setAdapter(viewPageAdapter);
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
}
和ViewPageAdapter.java
class ViewPageAdapter extends PagerAdapter {
private List<TikTokModel> tikTokModels;
private Context context;
private ImageButton playButton;
private VideoView videoView;
ViewPageAdapter(List<TikTokModel> tikTokModels, Context context) {
this.tikTokModels= tikTokModels;
this.context = context;
}
@Override
public int getCount() {
return tikTokModels.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view.equals(object);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View v = LayoutInflater.from(context).inflate(R.layout.tiktok_frame, container, false);
TextView Title = v.findViewById(R.id.Title);
videoView = v.findViewById(R.id.videoView);
LikeButton likeButton = v.findViewById(R.id.like);
playButton = v.findViewById(R.id.playButton);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (videoView.isPlaying()) {
videoView.pause();
playButton.setVisibility(View.VISIBLE);
} else {
videoView.resume();
playButton.setVisibility(View.INVISIBLE);
}
}
});
Uri uri = Uri.parse(tikTokModels.get(position).getUrl());
avidTitle.setText(tikTokModels.get(position).getTitle());
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();
playButton.setVisibility(View.INVISIBLE);
container.addView(v,0);
return v;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
在TikTokFragment
中,您可以考虑重写以下生命周期方法来暂停/恢复视频。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (videoView != null) videoView.pause();
} else {
if (videoView != null) videoView.resume();
}
}