2

我正在设置一个芯片组,并希望在我的 android 应用程序中单击输入时添加芯片。如何解决错误 IllegalStateException?

布局

<com.google.android.material.chip.ChipGroup
            android:id="@+id/chip_hashtag"
            android:text="Tag"
            android:layout_below="@+id/PlaceLayout"
            style="@style/Widget.MaterialComponents.Chip.Entry"
            android:layout_centerHorizontal="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:singleSelection="false"/>
        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/HashtagLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/chip_hashtag"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp">

            <EditText
                android:id="@+id/input_hashtag_advance"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="HashTag"
                android:inputType="text"
                android:nextFocusDown="@id/input_hashtag_advance"/>

        </com.google.android.material.textfield.TextInputLayout>

代码

input_hashtag_advance = view.findViewById(R.id.input_hashtag_advance);
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        Chip chip_item = (Chip) inflater.inflate(R.layout.layout_chip, null, false);
        ChipGroup chip_hashtag = view.findViewById(R.id.chip_hashtag);

        input_hashtag_advance.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch (keyCode) {
                        case KeyEvent.KEYCODE_DPAD_CENTER:
                        case KeyEvent.KEYCODE_ENTER: {

                            chip_item.setText(input_hashtag_advance.getText().toString());

                            chip_hashtag.addView(chip_item);
                            input_hashtag_advance.setText(null);
                        }
                        return true;
                        default:
                            break;
                    }
                }
                return false;
            }
        });

        chip_item.setOnCloseIconClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chip_hashtag.removeView(v);
            }
        });

我希望在输入时添加芯片,但是当第二次添加时出现错误。

java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。

在这条线上,我不想删除之前添加的芯片

chip_hashtag.addView(chip_item);
4

1 回答 1

1

根据迈克 M

由于该inflate()调用在 之外OnKeyListener,它只发生一次,并且 chip_item 总是指同一个 first inflated Chip。在你第一次添加它之后,它已经有了一个父级,所以第二次尝试会抛出那个异常。将整Chip chip_item = ...行移到 OnKeyListener 中,就在setText()调用之前。您还需要将setOnCloseIconClickListener()呼叫移到那里。此外,您可以为此只创建一个OnClickListener字段,并将该字段设置在所有的 上Chips,因为您要删除 View v传入的字段。– 迈克 M。

  input_hashtag_advance.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_ENTER: {
                        LayoutInflater inflater = LayoutInflater.from(getActivity());
                        Chip chip_item = (Chip) inflater.inflate(R.layout.layout_chip, null, false);
                        ChipGroup chip_hashtag = view.findViewById(R.id.chip_hashtag);
                        chip_item.setText(input_hashtag_advance.getText().toString());

                        input_hashtag_advance.setText(null);
                        chip_item.setOnCloseIconClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                chip_hashtag.removeView(v);
                            }
                        });
                        chip_hashtag.addView(chip_item);
                    }
                    return true;
                    default:
                        break;
                }
            }
            return false;
        }
    });
于 2019-08-18T10:39:08.183 回答