单击事件处理不起作用。 单击处理适用于CheckBox和TextView,但不能使用frameLayout。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@drawable/yellow_ripple"
android:clickable="true"
>
<TextView
android:clickable="false"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
<CheckBox
android:clickable="false"
android:id="@+id/box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
/>
在创建视图中:
View resultView = LayoutInflater.from(context)
.inflate(R.layout.filter_signle_view, parent, true);
selectedBox = (CheckBox) resultView.findViewById(R.id.box);
title = (TextView) resultView.findViewById(R.id.text);
title.setText(m_filter.getTitle());
selectedBox.setChecked(m_state.isSelected());
selectedBox.setOnCheckedChangeListener((compoundButton, b) ->
m_state.setSelected(b)
);
resultView.setClickable(true);
resultView.setOnClickListener(
view -> m_state.setSelected(!m_state.isSelected())
);
);
return resultView;
我想处理FrameLayout上的点击。它没有发生。
(我使用retrolamda)
答案 0 :(得分:1)
您正在将侦听器分配给帧布局的父级。
请将通胀的最后一个参数从true
更改为false
。更多 - LayoutInflater.inflate(int, ViewGroup, boolean)
View resultView = LayoutInflater.from(context).inflate(R.layout.filter_signle_view, parent, false);
答案 1 :(得分:0)
1)将监听器添加到frame layout
。你错过了它,这是最重要的事情。
2)添加
android:descendantFocusability="blocksDescendants"
以xml为框架布局。这样可以防止子项目点击。
答案 2 :(得分:0)
好的,所以在修复了很多编译错误和其他Lint问题后,我确实运行了你的代码(稍加修改)。它运作良好,这就是我所拥有的。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="?attr/selectableItemBackground"
android:clickable="true">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="false" />
<CheckBox
android:id="@+id/box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:clickable="false" />
</FrameLayout>
Java部分......
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View resultView = LayoutInflater.from(getActivity()).inflate(R.layout.generator_personalization, container, false);
CheckBox selectedBox = (CheckBox) resultView.findViewById(R.id.box);
TextView title = (TextView) resultView.findViewById(R.id.text);
title.setText("Title!");
selectedBox.setChecked(true);
selectedBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Toast.makeText(getActivity(), "Changed!", Toast.LENGTH_SHORT).show();
}
});
resultView.setClickable(true);
resultView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "CLICKED!", Toast.LENGTH_SHORT).show();
}
});
return resultView;
}
基本上,我认为最大的问题是将视图附加到inflate语句中的父级。尝试将最后一个参数更改为false
。
您还应注意,从代码设置点击侦听器也会在启用时设置clickable
属性。
希望这有帮助!
P.S。考虑将该布局更改为更易于维护的内容 - 例如使用单个CheckBox而不是FrameLayout + TextView + CheckBox而不使用文本。
答案 3 :(得分:0)
当您填充布局时,请将此参数提供给充气机服务:
public View inflate(int resource, ViewGroup root, boolean attachToRoot)
如果将attachToRoot设置为true,则返回的视图是您提供的根视图。
在您的示例中,您将其设置为true并返回&#34; parent&#34;图。
然后,您将单击侦听器设置为父视图组,但是,由于您将clickable设置为true,因此将在子FrameLayout上使用click事件。在您的情况下,这将无效,因为您将单击侦听器设置为错误的视图,而另一个视图消耗了单击事件。
所以你应该将attachToRoot设置为false,返回的视图将是你的FrameLayout,这将解决你的问题。