在 Android 中的另一个 Listener 中定义 Listener

Define Listener in another Listener in Android

为什么内部侦听器(addAddress 和 cancelAddress)不工作? 一切正常,但在膨胀 viewStub 后单击侦听器不起作用。这些按钮已添加到该 viewStub 中。

private View addressStubInflated;
//...
final View fview = inflater.inflate(R.layout.fragment_address, container, false);
//...
final ViewStub addressStub = (ViewStub) fview.findViewById(R.id.address_viewStub);
final Button addAddress = (Button) fview.findViewById(R.id.add_address_button);
final Button cancelAddress = (Button) fview.findViewById(R.id.cancel_address_button);
final ViewGroup addressesParent = (ViewGroup) fview.findViewById(R.id.addresses_container);
final Button addNewAddress = (Button) fview.findViewById(R.id.add_address);

addNewAddress.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //some codes ... OK
                if (addressStub.getParent() != null) {
                    addressStubInflated = addressStub.inflate(); //OK
                } else {
                    addressStubInflated.setVisibility(View.VISIBLE); //OK
                }

                addressStub.setOnInflateListener(new ViewStub.OnInflateListener() {
                    @Override
                    public void onInflate(ViewStub viewStub, View view) {
                        addAddress.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                addressStubInflated.setVisibility(View.GONE); //not work
                                addNewAddress.setVisibility(View.VISIBLE); //not work
                                addressesParent.setVisibility(View.VISIBLE); //not work
                            }
                        });

                        cancelAddress.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                addressStubInflated.setVisibility(View.GONE); //not work
                                addNewAddress.setVisibility(View.VISIBLE); //not work
                                addressesParent.setVisibility(View.VISIBLE); //not work
                            }
                        });
                    }
                });
            }
        });

我认为这里的问题是每次单击一个按钮时,您都在一次又一次地设置 addressStub.setOnInflateListener

您只需要在onCreate 中设置一次inflate 监听器。然后按钮可以继续膨胀视图,当然,但至少应该触发膨胀监听器。

此外,让您的 class 实现 OnClickListener 接口可以删除 "callback hell"