Android自定义视图,按钮无法点击

时间:2015-10-20 08:07:35

标签: android android-layout android-custom-view android-button android-inflate

我已创建了一个自定义merge视图,我使用onClickListener标记进行了充气。
在这个自定义视图中,我有一个按钮,我希望它能够做一些事情 我尝试了很多东西,但按钮只是拒绝被点击。

奇怪的是,我可以找到视图并改变他们的知名度。

是否可以通过这种方式点击按钮,还是应该以不同的方式完成?

我尝试过的事情:

  • onClick
  • 的匿名内部类
  • onClick
  • 的XML属性
  • 使用onClickListener(this)
  • 查看clickable(true)
  • 检查代码是否可点击(返回true)
  • 为XML和代码添加了getContext()
  • 构造函数的私有上下文,而不是init()
  • 将逻辑从onFinishInflate()移至inflate()
  • 使用inflater的视图查找视图
  • LayoutInflater切换到<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/internet_view_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/internet_offline"/> <custom.IconView android:id="@+id/internet_view_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="ICON" android:visibility="invisible" android:layout_below="@+id/internet_view_text"/> <Button android:id="@+id/internet_view_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="BUTTON" android:clickable="true" android:layout_below="@+id/internet_view_text"/> </merge>

夸大的自定义视图:

<custom.NoInternetView
    android:id="@+id/webview_no_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="invisible"
    app:automaticReconnect="false"/>

父视图的相关部分:

public class NoInternetView extends RelativeLayout implements View.OnClickListener {

    private static final String TAG = NoInternetView.class.getSimpleName();

    private static ConnectivityChangeListener listener;
    private static boolean automaticReconnect;
    private Context mContext;
    private View view;

    private Button button;

    public NoInternetView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NoInternetView, defStyleAttr, 0);
        automaticReconnect = a.getBoolean(R.styleable.NoInternetView_automaticReconnect, false);
        a.recycle();
        init();
    }

    public NoInternetView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NoInternetView(Context context) {
        this(context, null);
    }

    @Override
    protected void onFinishInflate() {
        Log.d(TAG, "onFinishInflate");
        super.onFinishInflate();

        button = (Button) view.findViewById(R.id.internet_view_button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Clicked on some Button");
                if (listener != null && NetworkHelper.hasAccess(getContext())) {
                    listener.connected();
                }
            }
        });
        button.setClickable(true);

        boolean clicked = button.callOnClick();
        Log.d(TAG, "clicked: "+clicked);

        TextView text = (TextView) view.findViewById(R.id.internet_view_icon);
        text.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Clicked on some TextView");
                if (listener != null && NetworkHelper.hasAccess(getContext())) {
                    listener.connected();
                }
            }
        });

        //check if the attribute 'automaticReconnect' is set to true
        //if so, show an icon instead of a button
        if (automaticReconnect){
            button.setVisibility(INVISIBLE);
            view.findViewById(R.id.internet_view_icon).setVisibility(VISIBLE);
        }

    }

    public void init(){
        Log.d(TAG, "init");
        view = LayoutInflater.from(mContext).inflate(R.layout.no_internet_view, this, false);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.d(TAG, "something happened?");
        return super.dispatchKeyEvent(event);
    }

    @Override
    public void onClick(View v) {
        Log.d(TAG, "Clicked on Button(TextView)");
        if (listener != null && NetworkHelper.hasAccess(getContext())){
            listener.connected();
        }
    }

班级档案:

index_end = HTML_text.find("</a>");

1 个答案:

答案 0 :(得分:0)

所以我得到了它的工作。以下是我为使其发挥作用所做的事情。

  1. merge标记替换为RelativeLayout,因为您要在视图内显示布局。更多信息:Android xml merge layout error on inflate

  2. 您已设置android:visibility="invisible",将其更改为android:visibility="visible"(这只是为了让视图可见,以后可以以编程方式进行更改)

  3. 将以下行添加到NoInternetView的init()方法中。您正在使用所有视图对布局进行充气,但只有在添加此视图时,您才能看到它。

    public void init(){
           Log.d(TAG, "init");
           view = LayoutInflater.from(mContext).inflate(R.layout.no_internet_view, this, false);
           this.addView(view);}
    
  4. 完成此操作后,该按钮将可见,单击该按钮将是可点击的。您可以使用匿名onClickListener或使视图实现onClickListener并覆盖onClick()方法。一切正常。