栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

【Android】基于bottomsheetdialogfragment的view组件setVisibility 没反应的问题记录

Java 更新时间:发布时间: 百科书网 趣学号
背景

在对bottomsheetdialogfragment内的文件中相关的UI进行展示:如果是真人模式才出现摄像头等相关资源。
一开始以为简单地设置一个View的Visibility就可以了,但是没想到这个东西是个fragment得适配他的生命周期。

知识巩固


bottomsheetdialogfragment生命周期:

最终实现逻辑
package im.zego.metalive.view;

import android.os.Bundle;
import android.view.View;

import im.zego.metalive.R;
import im.zego.metalive.utils.CheckDoubleClick;


public class MoreSettingDialog extends BaseBottomSheetDialogFragment implements View.OnClickListener {

    private MoreSettingView mSettingFlip; //翻转
    private MoreSettingView mSettingCamera; //摄像头
    private MoreSettingView mSettingMic; //麦克风
    private MoreSettingView mSettingResolution; //分辨率
    private MoreSettingView mSettingData; //实时数据

    private ISettingMoreCallBack callBack;
    private boolean isMicOpen = true; //麦克风是否开启
    private boolean isCamOpen = true; //摄像头是否开启

    @Override
    public int getLayoutResId() {
        return R.layout.metalive_dialog_more_setting;
    }

    @Override
    public void initView(Bundle savedInstanceState) {

        mSettingFlip = rootView.findViewById(R.id.setting_flip);
        mSettingCamera = rootView.findViewById(R.id.setting_camera);
        mSettingMic = rootView.findViewById(R.id.setting_mic);
        mSettingResolution = rootView.findViewById(R.id.setting_resolution);
        mSettingData = rootView.findViewById(R.id.setting_data);

        mSettingFlip.setOnClickListener(this);
        mSettingCamera.setOnClickListener(this);
        mSettingMic.setOnClickListener(this);
        mSettingResolution.setOnClickListener(this);
        mSettingData.setOnClickListener(this);

        setMic(isMicOpen);
        setCamara(isCamOpen);
        if (callBack != null) {
            //判断是否真人模式
            callBack.onRealMode();
        }

    }

    
    public void setMic(boolean isMicOpen) {
        mSettingMic.setMic(isMicOpen);
    }

    
    public void setCamara(boolean isCamOpen) {
        mSettingCamera.setCamara(isCamOpen);
    }

    
    public void setMicAndCamara(boolean isMicOpen, boolean isCamOpen) {
        this.isCamOpen = isCamOpen;
        this.isMicOpen = isMicOpen;
    }

    @Override
    public void onClick(View v) {
        if (callBack == null) {
            return;
        }
        int id = v.getId();
        if (id == R.id.setting_flip) {
            callBack.onClickFlip();
        } else if (id == R.id.setting_camera) {
            callBack.onClickCamera();
        } else if (id == R.id.setting_mic) {
            callBack.onClickMic();
        } else if (id == R.id.setting_resolution) {
            if (CheckDoubleClick.isFastDoubleClick()) {
                return;
            }
            callBack.onClickResolution();
        } else if (id == R.id.setting_data) {
            callBack.onClickData();
        }
    }

    public void setCallBack(ISettingMoreCallBack callBack) {
        this.callBack = callBack;
    }

    
    public void setCameraVisibility(boolean b) {
        if (mSettingCamera == null) {
            return;
        }
        if (b) {
            mSettingCamera.setVisibility(View.VISIBLE);
            mSettingFlip.setVisibility(View.VISIBLE);
        } else {
            mSettingCamera.setVisibility(View.GONE);
            mSettingFlip.setVisibility(View.GONE);
        }
    }

    public interface ISettingMoreCallBack {
        //是否在真人模式
        void onRealMode();

        void onClickFlip();

        void onClickCamera();

        void onClickMic();

        void onClickResolution();

        void onClickData();
    }

}

关键是 initView的调用实际,父类的方法回调为:

package im.zego.metalive.view;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;

import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;

import im.zego.metalive.R;


public abstract class BaseBottomSheetDialogFragment extends BottomSheetDialogFragment {

    protected Context mContext;

    protected View rootView;
    protected BottomSheetBehavior mBehavior;

    protected Dialog dialog;

    protected boolean showHeight = false;
    private int height = 385;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.mContext = context;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //解除缓存View和当前ViewGroup的关联
        ((ViewGroup) (rootView.getParent())).removeView(rootView);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.BaseBottomSheetDialog_metalive);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(getLayoutResId(), container, false);
        return rootView;
    }

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

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        //每次打开都调用该方法 类似于onCreateView 用于返回一个Dialog实例
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialogInterface) {
                BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface;
                if(isShowHeight()){
                    setupRatio(bottomSheetDialog);
                }
            }
        });

        return dialog;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setCancelable(true);
        getDialog().setCanceledOnTouchOutside(true);

        mBehavior = BottomSheetBehavior.from((View) rootView.getParent());
        mBehavior.setHideable(true);
        mBehavior.setSkipCollapsed(true);

        //圆角边的关键
        ((View) rootView.getParent()).setBackgroundColor(Color.TRANSPARENT);

    }

    
    private void setupRatio(BottomSheetDialog bottomSheetDialog) {
        FrameLayout bottomSheet = (FrameLayout)
                bottomSheetDialog.findViewById(R.id.design_bottom_sheet);
        BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
        ViewGroup.LayoutParams layoutParams = bottomSheet.getLayoutParams();
        layoutParams.height = dp2px(height);
        bottomSheet.setLayoutParams(layoutParams);
        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }


    public int dp2px(float dpValue) {
        final float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    public abstract int getLayoutResId();

    
    public abstract void initView(Bundle savedInstanceState);


    public boolean isShowHeight() {
        return showHeight;
    }

    public void setShowHeight(boolean showHeight) {
        this.showHeight = showHeight;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

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

设置回调没反应是因为在其生命周期中跑的时候回调来了但是生命周期还没开始,这就重新走一圈create故不起作用!

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1032994.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号