参考网址:https://blog.csdn.net/luohaowang320/article/details/42126847
https://www.jianshu.com/p/d1852b04a0aa
https://www.cnblogs.com/guanxinjing/p/12044196.html
https://blog.csdn.net/qq_34884729/article/details/78087804
简介:最近有个需求是一个类似PopupWindow的弹框中需要使用TabLayout+ViewPager实现弹框中包含多个Fragment,并可以左右滑动切换;起初用PopupWindow实现,但是发现FragmentManager是属于activity的,而popwindow是使用了其他的layout,所以FragmentManager找不到viewpager的id;所以要想实现这种效果只能更换别的,通过百度发现可以使用DialogFragment。完整代码在这里
dialog布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/yuanjiao_white">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layou_popup_window"
android:layout_width="match_parent"
android:background="@color/mywhite"
app:tabIndicatorColor="@android:color/holo_blue_light"
app:tabTextColor="@android:color/darker_gray"
app:tabSelectedTextColor="@android:color/black"
android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
android:id="@+id/view_pager_popup_window"
android:layout_below="@id/tab_layou_popup_window"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
NewDialogFragment代码
package com.example;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import com.example.R;
import com.example.adapter.MyViewPagerAdapter;
import com.example.fragment.Fragment01;
import com.example.fragment.Fragment02;
import java.util.ArrayList;
import java.util.List;
public class NewDialogFragment extends DialogFragment implements TabLayout.OnTabSelectedListener{
private Window window;
private Context context;
private TabLayout tab_layou_popup_window;
private ViewPager view_pager_popup_window;
private MyViewPagerAdapter myViewPagerAdapter;
private String[] titles = new String[]{"Fragment01", "Fragment02"};
private List<Fragment> fragments = new ArrayList<>();
public Fragment01 fragment01;
public Fragment02 fragment02;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
window = getDialog().getWindow();
//设置dialog的 进出 动画
window.setWindowAnimations(R.style.PopupWindowAnimStyle);
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0x00000000);
// 设置SelectPicPopupWindow弹出窗体的背景
window.setBackgroundDrawable(dw);
View view = inflater.inflate(R.layout.dialog, null);
tab_layou_popup_window = view.findViewById(R.id.tab_layou_popup_window);
view_pager_popup_window = view.findViewById(R.id.view_pager_popup_window);
//MODE_FIXED标签栏不可滑动,各个标签会平分屏幕的宽度
//tab_layou_shengchan.setTabMode(tabCount <= MOVABLE_COUNT ? TabLayout.MODE_FIXED : TabLayout.MODE_SCROLLABLE);
//设置TabLayout标签的显示方式
tab_layou_popup_window.setTabMode(TabLayout.MODE_FIXED);
//循环注入标签
for (String tab : titles) {
tab_layou_popup_window.addTab(tab_layou_popup_window.newTab().setText(tab));
}
//设置TabLayout点击事件
tab_layou_popup_window.setOnTabSelectedListener(this);
fragment01 = new Fragment01();
fragment02 = new Fragment02();
fragments.add(fragment01);
fragments.add(fragment02);
myViewPagerAdapter = new MyViewPagerAdapter(getChildFragmentManager(), titles, fragments);
view_pager_popup_window.setAdapter(myViewPagerAdapter);
view_pager_popup_window.setCurrentItem(0);
//保留(如果不加这句话,默认只加载两个fragment)
view_pager_popup_window.setOffscreenPageLimit(3);
tab_layou_popup_window.setupWithViewPager(view_pager_popup_window);
//拦截TabLayout点击事件(看自己需求是否需要)
TabLayout.Tab tab2 = tab_layou_popup_window.getTabAt(0);
LinearLayout v = tab2.view;
v.setOnTouchListener(onTouchListener);
return view;
}
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//这里做你想做的事情 然后return true 就不在往下执行了
return true;
}
};
@Override
public void onStart() {
/*设置对话框的宽高*/
int width = window.getWindowManager().getDefaultDisplay().getWidth();
width = width * 5 / 6;
int height = window.getWindowManager().getDefaultDisplay().getHeight();
height = height * 3 / 5;
window.getAttributes().width=width;
window.getAttributes().height=height;
/*下面的方式设置也行*/
//getDialog().getWindow().setLayout(getResources().getDisplayMetrics().widthPixels-200, getDialog().getWindow().getAttributes().height);
super.onStart();
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
view_pager_popup_window.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
}
MyViewPagerAdapter适配器
package com.example.adapter;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import java.util.List;
public class MyViewPagerAdapter extends FragmentPagerAdapter {//FragmentStatePagerAdapter、FragmentPagerAdapter
private int mChildCount = 0;
private Context context;
private List<Fragment> fragments;
private String[] titles;
private Fragment[] fragments2;
public MyViewPagerAdapter(FragmentManager fm, String[] titles, List<Fragment> fragments) {
super(fm);
this.titles = titles;
this.fragments = fragments;
}
public MyViewPagerAdapter(FragmentManager fm, String[] titles,
List<Fragment> fragments,
FinishUpdateListener mFinishUpdateListener) {
super(fm);
this.titles = titles;
this.fragments = fragments;
this.mFinishUpdateListener = mFinishUpdateListener;
}
@Override
public Fragment getItem(int arg0) {
return fragments.get(arg0);
//return fragments2[arg0];
}
@Override
public void notifyDataSetChanged() {
mChildCount = getCount();
super.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
//重绘
if (mChildCount > 0) {
mChildCount--;
return POSITION_NONE;
}
return super.getItemPosition(object);
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public int getCount() {
//System.out.println("size:::"+fragments.size());
return fragments.size();
//return fragments2.length;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
@Override
public void finishUpdate(ViewGroup container) {
super.finishUpdate(container);
if (mFinishUpdateListener!=null){
mFinishUpdateListener.onToolBarChange();
}
//System.out.println("调用了finishUpdate...............");
}
public void setFinishUpdateListener(FinishUpdateListener finishUpdateListener) {
mFinishUpdateListener = finishUpdateListener;
}
FinishUpdateListener mFinishUpdateListener;
public interface FinishUpdateListener{
void onToolBarChange();
}
}
使用
private void openDialog(){
if (dialogFragment!=null&&dialogFragment.isVisible()){//防止多次点击打开多个
return;
}
dialogFragment = new NewDialogFragment();
dialogFragment.show(getSupportFragmentManager(),"dialog");
}