Android onClickListener用于整个布局,内部视图使用不同的onClickListener

时间:2014-11-12 21:45:54

标签: android onclicklistener

我有一个简单的LinearLayout,它由TextViewEditText组成。我想要实现的行为是能够点击EditText并像平常一样处理它,但将包含的LinearLayout视为启动新活动的按钮。

因此,例如,如果用户单击视图中按钮周围的空间,则会启动新活动。如果用户单击EditText,则会出现键盘,用户可以填充EditText。

这是布局的简单onClickListener,它简单地说明它已被点击:

LinearLayout test = (LinearLayout)findViewById(R.id.linearLayout1);
    test.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View arg0) {
            System.out.println("layout clicked");
        }
    });

EditText有一个OnFocusChangeListener,只需说明它何时获得焦点:

@Override
public void onFocusChange(View v, boolean hasFocus) {
    System.out.println("EditText clicked");
}

结果:

- 当用户点击布局时,结果“布局点击”是正确的 - 当用户点击edittext时,结果是“layout clicked”,然后是“EditText clicked”,这是不正确的。在这种情况下,我想忽略线性布局的onClick事件。

2 个答案:

答案 0 :(得分:1)

尝试创建一个包含一个包含TextView的LinearLayout的FrameLayout,并将EditText放在LinearLayout之上。这样您就不需要更改有关侦听器的任何内容。

所以它会是这样的:

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</LinearLayout>


<EditText
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="200dp" />

</FrameLayout>

注意:使用边距调整EditText的位置

答案 1 :(得分:0)

我想这样的事情应该有用,虽然它不是最干净的解决方案。

声明在单击布局时应执行的runnable

final Handler handler = new Handler(); 
Runnable layoutPressed = new Runnable() { 
    public void run() { 
        // LAYOUT CLICKED
    }   
};

然后在布局onClickListener中启动此runnable。

LinearLayout test = (LinearLayout)findViewById(R.id.linearLayout1);
    test.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View arg0) {
            handler.postDelayed(layoutPressed, 100);
        }
    });

取消onFocusChange中的runnable。

@Override
public void onFocusChange(View v, boolean hasFocus) {
    handler.removeCallbacks(layoutPressed);
    // EditText clicked
}

因此,无论何时单击editText,都会首先调用布局的onClick,但是当调用editText的onFocusChange时,操作将被取消。

单击布局时,onClick将被调用,并将以100毫秒的延迟执行其操作。

您可能需要修改可运行的延迟。