如果将 Webview 作为子项,则布局 onClick 事件不起作用

Posted

技术标签:

【中文标题】如果将 Webview 作为子项,则布局 onClick 事件不起作用【英文标题】:Layout onClick event does not work if it has Webview as a child 【发布时间】:2018-05-12 00:46:12 【问题描述】:

我的问题是我有一个LinearLayout,我在运行时将它膨胀到ScrollView 内的LinearLayout。 这是main_activity.xml

<ScrollView
        android:id="@+id/scrollView"
        android:layout_
        android:layout_
        android:layout_above="@+id/controlLayoutCV"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/toolLayoutCV">

        <RelativeLayout
            android:layout_
            android:layout_
            android:paddingBottom="@dimen/dp5"
            android:paddingLeft="@dimen/dp7"
            android:paddingRight="@dimen/dp7"
            android:paddingTop="@dimen/dp5">

            <android.support.v7.widget.CardView
                android:id="@+id/questionQuizCV"
                android:layout_
                android:layout_
                app:cardElevation="@dimen/dp2">

                <com.emedicoz.app.CustomViews.JustifiedTextView
                    android:id="@+id/questionQuizTV"
                    android:layout_
                    android:layout_
                    android:padding="@dimen/dp5"
                    android:text="" />
            </android.support.v7.widget.CardView>

            <LinearLayout
                android:id="@+id/quizQuestionLL"
                android:layout_
                android:layout_
                android:layout_below="@+id/questionQuizCV"
                android:layout_marginTop="@dimen/dp5"
                android:orientation="vertical"
                android:padding="@dimen/dp5" />

        </RelativeLayout>
 </ScrollView>

这是item_layout.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mcqlayout_LL"
    android:layout_
    android:layout_
    android:layout_margin="@dimen/dp5"
    android:minHeight="30dp"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/dp7"
    android:paddingTop="@dimen/dp7">

    <TextView
        android:id="@+id/optioniconTV"
        android:layout_
        android:layout_
        android:background="@drawable/circle_bg"
        android:gravity="center"
        android:padding="@dimen/dp3"
        android:text="A"
        android:textSize="@dimen/sub_heading_text_size" />

    <com.emedicoz.app.CustomViews.JustifiedTextView
        android:id="@+id/optionTextTV"
        android:layout_
        android:layout_
        android:layout_marginLeft="@dimen/dp10" />
</LinearLayout>

这是我为直接显示html 内容而创建的CustomTextView。 JustifiedTextView.class

public class JustifiedTextView extends WebView 
    private String text = "";
    private int textSize = 12;
    private int backgroundColor = Color.TRANSPARENT;

    public JustifiedTextView(Context context, AttributeSet attrs) 
        super(context, attrs);
        this.setWebChromeClient(new WebChromeClient() );
    

    public void setText(String s) 
        this.text = s;
        reloadData();
    

    @SuppressLint("NewApi")
    private void reloadData() 

        // loadData(...) has a bug showing utf-8 correctly. That's why we need to set it first.
        this.getSettings().setDefaultTextEncodingName("utf-8");

        //        this.loadData(String.format(core,textColor,textSize,text), "text/html","utf-8");
        this.loadData(text, "text/html", "utf-8");

        // set WebView's background color *after* data was loaded.
        super.setBackgroundColor(backgroundColor);

        // Hardware rendering breaks background color to work as expected.
        // Need to use software renderer in that case.
        if (android.os.Build.VERSION.SDK_INT >= 11)
            this.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
    

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
            Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    

    public void setTextSize(int textSize) 
        this.textSize = textSize;
        reloadData();
    

我已经尝试了下面提到的所有解决方案。

    Disable WebView touch events in Android 已尝试将android:descendantFocusability="blocksDescendants" 设置为ScrollView

为什么点击WebViewLinearLayout的点击事件没有触发?

这就是我膨胀Layout 并处理点击事件的方式。

    private LinearLayout initAnswerMCViews(String text, String questions, Questions questionsModel) 
    LinearLayout view = (LinearLayout) View.inflate(activity, R.layout.mcq_quiz, null);

    answerTV = (JustifiedTextView) view.findViewById(R.id.optionTextTV);
    optionIconTV = (TextView) view.findViewById(R.id.optioniconTV);
    mcqItemLL = (LinearLayout) view.findViewById(R.id.mcqlayout_LL);

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    lp.setMargins(3, 3, 3, 3);
    mcqItemLL.setLayoutParams(lp);

    if (questionsModel.isAnswered()) 
        String[] answer = questionsModel.getUser_answer().split(",");
        for (int i = 0; i < answer.length; i++) 
            if (answer[i].equals(text)) 
                answerTV.setText(questions);
                optionIconTV.setText(text);
                optionIconTV.setBackgroundResource(R.drawable.circle_bg_true);
             else 
                answerTV.setText(questions);
                optionIconTV.setText(text);
            
        
     else 
        answerTV.setText(questions);
        optionIconTV.setText(text);
    

    mcqItemLL.setTag(R.id.questions, optionIconTV.getText().toString());
    mcqItemLL.setTag(R.id.optionsAns, mcqItemLL);
    mcqItemLL.setOnClickListener(optionClickListener);
    viewArrayList.add(mcqItemLL);
    return view;

为什么单击Layout 中的WebView 部分时单击不被监听?

【问题讨论】:

尝试设置生成视图的可点击属性(通过 setClickable(boolean))。将您的 LinearLayout 设置为不可点击,将子视图设置为可点击 我需要使可点击的主要父布局。所以我不能这样做 哦,我误解了你的问题。您想调用 LinearLayout 的 onClick() 而不是您孩子的 onClick(),对吗?在这种情况下,您可以做相反的事情:将子项设置为不可点击,将 LinearLayout 设置为可点击。如果您也需要孩子可以点击,您可以使用 onTouchListener,检测点击(使用 GestureDetector)并返回 true 以指示点击事件已在 LinearLayout 的 onTouch() 中消耗。 @GabrielCosta 已经通过在两个 TextView 中启用 clickable false 来实现,但它仍然无法正常工作。 我相信 LinearLayout 的默认可点击是 false。那么,您是否尝试将 clickable=true 添加到您的 LinearLayout 中?尝试将“clickable=true”添加到 LinearLayouts(quizQuestionLL 和 mcqlayout_LL) 【参考方案1】:

我终于找到了问题。 这基本上是父母ScrollviewCustomWebViewTouch Event冲突的问题。 因此,通过使用本身覆盖ClickListenerTouchListener 的新类。

package com.app.CustomViews;

import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;


public class TestSeriesOptionWebView extends WebView implements GestureDetector.OnGestureListener 
    private boolean check = false;

    class LongClick implements OnLongClickListener 
        final /* synthetic */ TestSeriesOptionWebView testSeriesOptionWebView;

        LongClick(TestSeriesOptionWebView testSeriesOptionWebView) 
            this.testSeriesOptionWebView = testSeriesOptionWebView;
        

        public boolean onLongClick(View view) 
            return true;
        
    

    public TestSeriesOptionWebView(Context context) 
        super(context);
        handleClick();
    

    public TestSeriesOptionWebView(Context context, AttributeSet attributeSet) 
        super(context, attributeSet);
        handleClick();
    

    public TestSeriesOptionWebView(Context context, AttributeSet attributeSet, int i) 
        super(context, attributeSet, i);
        handleClick();
    

    private void handleClick() 
        setFocusable(false);
        /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
            setLayerType(View.LAYER_TYPE_HARDWARE, null);
         else 
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        */
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        setVerticalScrollBarEnabled(false);
        setBackgroundColor(0);
        setHapticFeedbackEnabled(false);
        setOnLongClickListener(new LongClick(this));
    

    public void setDisableWebViewTouchListener(boolean z) 
        this.check = z;
    

    public boolean onTouchEvent(MotionEvent motionEvent) 
        if (this.check) 
            return false;
        
        return super.onTouchEvent(motionEvent);
    

    public boolean canScrollHorizontal(int i) 
        int computeHorizontalScrollOffset = computeHorizontalScrollOffset();
        int computeHorizontalScrollRange = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
        if (computeHorizontalScrollRange == 0) 
            return false;
        
        if (i < 0) 
            if (computeHorizontalScrollOffset <= 0) 
                return false;
            
            return true;
         else if (computeHorizontalScrollOffset >= computeHorizontalScrollRange - 1) 
            return false;
         else 
            return true;
        
    

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    

    public boolean onDown(MotionEvent motionEvent) 
        return true;
    

    public void onShowPress(MotionEvent motionEvent) 
    

    public boolean onSingleTapUp(MotionEvent motionEvent) 
        return false;
    

    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float f, float f2) 
        return f != 0.0f;
    

    public void onLongPress(MotionEvent motionEvent) 
    

    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float f, float f2) 
        return true;
    
  

如果有人遇到此类问题,请使用此自定义类TestSeriesOptionWebView.class

【讨论】:

以上是关于如果将 Webview 作为子项,则布局 onClick 事件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果 Flutter Row 溢出,则忽略子项

Android Studio在WebView中编译Web应用

没有带有拉动刷新的互联网消息 webview 片段

Extjs 4.1.1 HBox 布局未显示所有子项或项重叠

无法使用休眠删除将集合作为子项的实体

是否可以在 ExpandableListView 中为子项放置不同的布局?