Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AppCompatDialogFragment 做的弹窗,在弹窗里的一个view上做guide,显示位置不正确,包括高亮部分 #54

Open
zouxianbincc opened this issue Sep 16, 2019 · 8 comments

Comments

@zouxianbincc
Copy link

AppCompatDialogFragment 做的弹窗,
在弹窗里的一个view上做guide,
显示位置不正确,包括高亮部分。
无法正确显示在指定的view上

@binIoter
Copy link
Owner

方便贴一下调用代码吗?

@zouxianbincc
Copy link
Author

public static void openStore(Activity activity, View view) {

    view.post(new Runnable() {
        @Override
        public void run() {
            GuideBuilder builder = new GuideBuilder();
            builder.setTargetView(view)
                    .setAlpha(156)
                    .setHighTargetCorner(20)
                    .setHighTargetPadding(10);
            builder.setOnVisibilityChangedListener(new GuideBuilder.OnVisibilityChangedListener() {
                @Override
                public void onShown() {
                }

                @Override
                public void onDismiss() {
                    isOpenShutStoreDialog(activity, false);
                }
            });
            builder.addComponent(new Component() {
                @Override
                public View getView(LayoutInflater inflater) {
                    LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.layout_guide_store, null);
                    ll.setGravity(Gravity.RIGHT);
                    TextView tv = ll.findViewById(R.id.tv);
                    ImageView iv = ll.findViewById(R.id.iv);
                    iv.setImageResource(R.mipmap.down_top);
                    tv.setText("点击这里进行 \"开店/关店\" 操作");
                    return ll;
                }

                @Override
                public int getAnchor() {
                    return ANCHOR_OVER;
                }

                @Override
                public int getFitPosition() {
                    return FIT_CENTER;
                }

                @Override
                public int getXOffset() {
                    return 0;
                }

                @Override
                public int getYOffset() {
                    return 0;
                }
            });
            Guide guide = builder.createGuide();
            guide.show(activity);
        }
    });


}

弹出dialog SysDialogFragment 是继承AppCOmpatDialogFragment
public static void isOpenShutStoreDialog(Activity activity, boolean shopState) {

    String msg = shopState ? "是否确定关闭门店?" : "是否确定开启门店?";

    final SysDialogFragment syDialogFragment = new SysDialogFragment();
    syDialogFragment.setTitleText("提示")
            .setMesssageText(msg)
            .setMesssageTextSize(16f)
            .setMesssageTextColor(R.color.black)
            .setCancelTextColor(R.color.black)//默认#68c81c,在xml中设置
            .setCancelTextSize(16f)//默认14sp,在xml中设置
            .setCancelBtn("是", new View.OnClickListener() {
                @Override
                public void onClick(View v) {//默认文字为“取消”,在xml中设置
                    syDialogFragment.dismiss();

                }
            })
            .setConfirmTextColor(R.color.black)//默认#68c81c,在xml中设置
            .setConfirmTextSize(16f)//默认14sp,在xml中设置
            .setConfirmBtn("否", new View.OnClickListener() {
                @Override
                public void onClick(View v) {//默认文字为“确定”,在xml中设置
                    syDialogFragment.dismiss();
                }
            })
            .showDialog(((AppActivity) activity).getSupportFragmentManager());
}

public class SysDialogFragment extends SyDialogFragment {

boolean shopState;

@Override
protected void initData() {
    super.initData();






}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (shopState){
        StoreStatusGuide.isShutStore(getActivity(),mBtnConfirm);
    }else {
        StoreStatusGuide.isOpenStore(getActivity(),mBtnConfirm);
    }
}

}

@zouxianbincc
Copy link
Author

弹窗里的view 调用蒙层
public static void isOpenStore(Activity activity, View view) {

    view.post(new Runnable() {
        @Override
        public void run() {
            GuideBuilder builder = new GuideBuilder();
            builder.setTargetView(view)
                    .setAlpha(156)
                    .setHighTargetCorner(20)
                    .setHighTargetPadding(10);
            builder.setOnVisibilityChangedListener(new GuideBuilder.OnVisibilityChangedListener() {
                @Override
                public void onShown() {
                }

                @Override
                public void onDismiss() {
                    isOpenShutStoreDialog(activity, true);
                }
            });
            TopRightComponent topRightComponent = new TopRightComponent();
            topRightComponent.setContent("点击 \"是\" 进行确认 \"开店\" ");
            topRightComponent.setPicture(R.mipmap.down_bottom);
            topRightComponent.setAnchor(Component.ANCHOR_TOP);
            builder.addComponent(topRightComponent);
            Guide guide = builder.createGuide();
            guide.show(activity);
        }
    });



}

public static void isShutStore(Activity activity, View view) {

    GuideBuilder builder = new GuideBuilder();
    builder.setTargetView(view)
            .setAlpha(156)
            .setHighTargetCorner(20)
            .setHighTargetPadding(10);
    builder.setOnVisibilityChangedListener(new GuideBuilder.OnVisibilityChangedListener() {
        @Override
        public void onShown() {
        }

        @Override
        public void onDismiss() {

        }
    });
    TopRightComponent topRightComponent = new TopRightComponent();
    topRightComponent.setContent("点击 \"是\" 进行确认 \"关店\" ");
    topRightComponent.setPicture(R.mipmap.down_bottom);
    topRightComponent.setAnchor(Component.ANCHOR_TOP);
    builder.addComponent(topRightComponent);
    Guide guide = builder.createGuide();
    guide.show(activity);

}

@zouxianbincc
Copy link
Author

image

@binIoter
Copy link
Owner

onActivityCreated 时你的fragment还没有attach在屏幕上,虽然你post到了下一个消息循环,但是并不能保证此时fragment已经attach到屏幕上了,你可以试试postdelay 500ms或者监听viewtreeobserver.ongloballayoutlistener 里处理,试一下

@zouxianbincc
Copy link
Author

postdelay 测试 无效
mBtnConfirm.getViewTreeObserver().addOnGlobalLayoutListener 测试 无效
最终这两种方案,还是不能解决

@sxhdroid
Copy link

我定义了一个基类,在基类的fragment中这样操作:

protected void onGlobalLayout(){

    }

    @Override
    public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                NewBasePresenterFragment.this.onGlobalLayout();
            }
        });
    }

然后在子类的onGlobalLayout()方法中调用设置蒙板可以实现
```
@OverRide
protected void onGlobalLayout() {
showGuideView(ivVoice);
}

@easy-money-5
Copy link

怎么展示在 dialog 里

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants