可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've got a custom LinearLayout with a smaller TextView child. I'd like to be able to click the area not covered by the TextView, so I set clickable=true and an onclicklistener to the LinearLayout, but onClick is not triggered. If I set the onclick listener on the TextView it works as expected...
Anybody can help?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ar_item" android:layout_width="202dp"
android:layout_height="62dp" android:background="@drawable/bg_item_ar"
android:clickable="true">
<TextView android:id="@+id/ar_item_txt"
android:layout_width="164dp" android:layout_height="fill_parent"
android:paddingBottom="8dp" android:paddingLeft="8dp"
android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center"
android:background="#50000000" />
</LinearLayout>
My custom LinearLayout
public class ARView extends LinearLayout
{
public ARView(final Context context, String name, String id)
{
super(context);
getLayoutInflater().inflate(R.layout.ar_item, this ,true);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.ar_item, null);
TextView textView = (TextView) findViewById(R.id.ar_item_txt);
textView.setText(name);
setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});
}
}
回答1:
for every child
android:duplicateParentState="true"
回答2:
android:duplicateParentState="true"
did not help me.
To make your layout clickable with its children you need add this option for every child:
android:clickable="false"
Then click handling will go up to parent.
回答3:
This isn't your case, but I had similar problem with clickable ViewGroup
. After a hour of looking for solution a found out that I set android:inputType
to TextView
inside my ViewGroup
which was blocking onClick()
listener (no idea why)
Don't use android:inputType
with TextView
回答4:
You aren't using your custom View; you're using a standard LinearLayout. Your XML tag should be:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
回答5:
Your TextView height covers the whole parent (whole layout) so you might clicking on empty space but not on the layout. Try using wrap_content for android:layout_height for your TextView. Set click listener for the layout as well.
回答6:
One thing to make sure of is that another view is not on top of the view you are trying to click. This is especially common in FrameLayouts (where your sub LinearLayout may be covered) or with Relative Layouts you might have forgot to update this line:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
so that views don't fill the same space.
回答7:
The android:duplicateParentState="true"
made my TextView looks like it's disabled, and cannot receive click event.
All you need is set the TextView clickable="false"
. So the click event will dispatch to parent layout, and the TextView still can react to touch event (with ripple effect).
回答8:
Make Your parent LinearLayout's android:clickable="true"
Make all of the the childview's android:clickable="false"
Under Linearlayout - Remove android:inputType="" from TextView
回答9:
The problem may be from the textview that has android:layout_height="fill_parent"
in its layout. If that doesn't fix the issue, the problem may be the onClick() event. The linear layout may not actually ever call onClick() since its a layout. Try overriding the onTouch() event listener instead.
回答10:
If the views in question are TextView
s, you may need to set them as focusable="false"
so that the first click isn't used focusing on the text view.
回答11:
Add the following attributes to the linearlayout
Any Click events not handled by the child views will be automatically passed over to the LinearLayout.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:focusable="true"
android:clickable="true">
<child/>
<child/>
</LinearLayout>
回答12:
I faced the same problem, and all the XML Attributes didn't work. I am not sure if this happens because i programmatically inflate and add the views, but this is how i worked around the problem.
I have a Class which extends LinearLayout, with a TextView and an ImageView.
After inflating the layout and getting the views, I assigned the child views a OnClickListener, when pressed, executes the LineaLayout's onClickListner.
public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;
@Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l);
clickListener = l;
}
void afterViews() {
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
}
I also tried overriding OnTouchListener, but then my child views didn't have the ripple effect, which I needed.
回答13:
None of the solutions above forked for me. Than i noticed that a LinkMovementMethod
set to TextView
inside my LinearLayout
. This class intercepts touch events, click events and properties of TextView
such as clickable, focusable vs..
回答14:
I faced the same problem, and all the XML attributes didn't work. I think this happens because I programmatically inflate and add the views. The fix for me was to - also that programatically - set the inflated root view not clickable:
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(Yes, I tried to have the some_layout
not clickable in XML.)