
在对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故不起作用!