Android中DialogFragment内TabLayout+ViewPager

 

参考网址: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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值