huburt-Hu / NewbieGuide

Android 快速实现新手引导层的库,通过简洁链式调用,一行代码实现引导层的显示
Apache License 2.0
3.55k stars 519 forks source link

没找到方法给relativeGuide里的view设置点击事件,注意,不是高亮区域 #150

Open oOJohn6Oo opened 4 years ago

oOJohn6Oo commented 4 years ago

求教,开发者自己也说了相对布局是因为直接setLayoutRes不准确才提出的,那么假设他逻辑严谨、记忆力好且手脚勤快,那么他应该是写了的啊?

aitsuki commented 4 years ago

看了下2.4版本的源码,确实没设置的地方。不过可以通过取巧的方式给RelativeGuide设置点击事件:

在show()方法调用的时候,会将一个FrameLayout给添加到contentView中,那时候再findViewById就好了,不过需要确保目标的id是全局唯一的,不然可能会找错。

.setOnGuideChangedListener(new OnGuideChangedListener() {
    @Override
    public void onShowed(Controller controller) {
        // 在这里设置RelativeGuide的点击事件,要确保该View的id在此activity中是唯一的!
        if (getActivity() != null) {
            View cancelBtn = getActivity().findViewById(R.id.guideCancelBtn);
            if (cancelBtn != null) {
                getActivity().findViewById(R.id.guideCancelBtn)
                        .setOnClickListener(v -> cardGuid.remove());
            }
        }
    }

    @Override
    public void onRemoved(Controller controller) {

    }
})
chengxushi commented 4 years ago

楼上说的方法可以解决,就很棒

meihualuo commented 4 years ago

也可以像这样设置 在填充监听中获取到view并给该view设置点击事件 GuidePage.newInstance() .addHighLight(main_newGame) // .addHighLightWithOptions(main_continueGame, options) // .addHighLight(main_history, HighLight.Shape.ROUND_RECTANGLE, 25, 0, null) .setLayoutRes(R.layout.guide_btn) .setEverywhereCancelable(false) .setOnLayoutInflatedListener { view, controller -> view.findViewById(R.id.textView3).setOnClickListener { controller.remove() } }

yalarc commented 4 years ago

controller.remove() 直接就中断引导了?还有啥好方法吗

roybill commented 3 years ago

@AItsuki 请问一下,我是在fragment内,并且是多层的,该怎么设置呢? 我想要获取第四层relativeGuide布局子view的点击事件,我这样写始终获取不响应点击事件,该怎么解决呢? @Override public void guide(Fragment fragment, ConstraintLayout mLandServiceLayout, ConstraintLayout mLandLayout, ConstraintLayout mInvestLayout, ConstraintLayout mFastLayout, TextView mGuideFive) { NewbieGuide.with(fragment) .setLabel("第一层") .alwaysShow(true)//总是显示 true ,调试时可以打开 .addGuidePage(GuidePage.newInstance() //1.需要高亮的view , 2.高亮类型(圆,矩形,椭圆,圆角矩形...) 3.圆角大小 .addHighLight(mLandServiceLayout, HighLight.Shape.ROUND_RECTANGLE,10,0,null) .setEverywhereCancelable(false) //是否点击任意位置消失引导页,默认true .setLayoutRes(R.layout.handle_guide_one, R.id.btn_handle_guid_one_next) .setOnLayoutInflatedListener(new OnLayoutInflatedListener() { @Override public void onLayoutInflated(View view, Controller controller) { TextView finish = view.findViewById(R.id.tv_handle_guid_one_finish); finish.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线 finish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { controller.remove();//跳过 } }); view.findViewById(R.id.btn_handle_guid_one_next).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { controller.showPage(1);//点击显示第二层 } }); } })) .setLabel("第二层") .addGuidePage(GuidePage.newInstance() .addHighLight(mLandLayout,HighLight.Shape.ROUND_RECTANGLE,10,0,null) .setEverywhereCancelable(false) //是否点击任意位置消失引导页,默认true .setLayoutRes(R.layout.handle_guide_two, R.id.btn_handle_guid_two_next) .setOnLayoutInflatedListener(new OnLayoutInflatedListener() { @Override public void onLayoutInflated(View view, Controller controller) { TextView finish = view.findViewById(R.id.tv_handle_guid_two_finish); finish.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线 finish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { controller.remove();//跳过 } }); view.findViewById(R.id.btn_handle_guid_two_next).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { controller.showPage(2);//点击显示第三层 } }); } })) .setLabel("第三层") .addGuidePage(GuidePage.newInstance() .addHighLight(mInvestLayout,HighLight.Shape.ROUND_RECTANGLE,10,0,null) .setEverywhereCancelable(false) //是否点击任意位置消失引导页,默认true .setLayoutRes(R.layout.handle_guide_three, R.id.btn_handle_guid_three_next) .setOnLayoutInflatedListener(new OnLayoutInflatedListener() { @Override public void onLayoutInflated(View view, Controller controller) { TextView finish = view.findViewById(R.id.tv_handle_guid_three_finish); finish.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线 finish.findViewById(R.id.tv_handle_guid_three_finish).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { controller.remove();//跳过 } }); view.findViewById(R.id.btn_handle_guid_three_next).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { controller.showPage(3);//点击显示第四层 } }); } })) .setLabel("第四层") .addGuidePage(GuidePage.newInstance() .addHighLight(mFastLayout,HighLight.Shape.ROUND_RECTANGLE,10,0,new RelativeGuide(R.layout.handle_guide_four, Gravity.TOP, 0)) .setEverywhereCancelable(false) //是否点击任意位置消失引导页,默认true ) .setOnGuideChangedListener(new OnGuideChangedListener() { @Override public void onShowed(Controller controller) {

                    LogUtils.d("1053  111111111111111111111"+mActivity);
                    // 在这里设置RelativeGuide的点击事件,要确保该View的id在此activity中是唯一的!
                    if (mActivity != null) {
                        View cancelBtn = fragment.getActivity().findViewById(R.id.tv_handle_guid_four_finish);
                        if (cancelBtn != null) {
                            fragment.getActivity().findViewById(R.id.tv_handle_guid_four_finish).setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    //点击无响应
                                    Toast.makeText(mActivity, "111111111", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }
                @Override
                public void onRemoved(Controller controller) {

                }
            })
            .setLabel("第五层")
            .addGuidePage(GuidePage.newInstance()
                    .addHighLight(mGuideFive,HighLight.Shape.ROUND_RECTANGLE,10,0,null)
                    .setEverywhereCancelable(false) //是否点击任意位置消失引导页,默认true
                    .setLayoutRes(R.layout.handle_guide_five, R.id.btn_handle_guid_five_next)
                    .setOnLayoutInflatedListener(new OnLayoutInflatedListener() {
                        @Override
                        public void onLayoutInflated(View view, Controller controller) {
                            view.findViewById(R.id.btn_handle_guid_five_next).setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    controller.remove();//最后一页就移除所有遮罩
                                }
                            });
                        }
                    }))
          .show();
}