我有一个简单的LinearLayout,它由TextView
和EditText
组成。我想要实现的行为是能够点击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事件。
答案 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毫秒的延迟执行其操作。
您可能需要修改可运行的延迟。