Android处理对parentView

时间:2015-07-06 20:20:58

标签: android onclicklistener

单击事件处理不起作用。 单击处理适用于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)

4 个答案:

答案 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,这将解决你的问题。