4

当我在 Android 中动态构建时,我必须通过调用View将其添加到“父级”ViewGroup

myLinearLayout.addView(myView);

我知道我可以通过出色的onHierarchyChangeListenerViewGroup监督要添加的任何孩子,但就我而言,我需要反馈本身。因此我的问题是:View

View.onAddedToParent()有没有我可以建立的回调或监听器之类的东西?

说得非常清楚:我希望视图自己处理所有事情,我知道我可以在“父”中捕获事件,然后通知视图有关事物的事实,但这在这里是希望的。我只能改变观点

编辑:我刚刚发现onAttachStateChangeListener,它似乎适用于大多数情况,但我想知道这是否真的是正确的解决方案。我在想一个View也可以在ViewGroup不脱离窗户的情况下从一个传递到另一个。因此,即使我愿意,我也不会收到事件。如果您有见识,能否详细说明一下?

提前致谢

4

3 回答 3

5

您可以创建自定义视图并在其 onAttachedToWindow 中执行您的操作

public class CustomView extends View {

   public CustomView(Context context) {
       super(context);
   }

   @Override
   protected void onAttachedToWindow() {
       super.onAttachedToWindow();
       Log.d("CustomView", "onAttachedToWindow called for " + getId());
       Toast.makeText(getContext(), "added", 1000).show();
   }
}

如果您想确保您的自定义视图添加到您想要的正确视图组

@Override
 protected void onAttachedToWindow() {
    // TODO Auto-generated method stub
    super.onAttachedToWindow();

    if(((View)getParent()).getId()== R.id.relativelayout2)
    {           
        Log.d("CustomView","onAttachedToWindow called for " + getId());
        Toast.makeText(context, "added", 1000).show();          
    }

}
于 2013-10-09T10:55:03.020 回答
2

removeView()根据Android源代码,除非首先在其父级上调用视图,否则无法将视图移动到另一个布局,并且如果您查看 的代码removeView(),它会调用removeViewInternal(),而后者又会调用 的重载removeViewInternal(),在这一行调用view.dispatchDetachedFromWindow(),其中,基于Android源代码这一行调用onDetachedFromWindow()。然后使用以相同方式addView()调用的视图添加视图。onAttachedToWindow()

于 2019-03-29T01:52:17.793 回答
1

在我看来,你想要这样;

创建视图;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    final LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    layout.setOnHierarchyChangeListener(new OnHierarchyChangeListener() {

        @Override
        public void onChildViewRemoved(View parent, View child) {
            Log.e("View","removed");
            if(child instanceof CustomButton){
                CustomButton button = (CustomButton)child;
                button.addListener();
            }
        }

        @Override
        public void onChildViewAdded(View parent, View child) {
            Log.e("View","added");
            if(child instanceof CustomButton){
                CustomButton button = (CustomButton)child;
                button.addListener();
            }
        }
    });

    for(int i = 0; i < 10; ++i){
        CustomButton view = new CustomButton(this);
        view.setText("Button "+i);
        layout.addView(view, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                layout.removeViewAt(layout.getChildCount()-1);
            }
        });

    }

    setContentView(layout);

}

听众;

public interface OnAddedListener {

    public void addListener();

}

自定义按钮类;

public class CustomButton extends Button implements OnAddedListener{

    public CustomButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void addListener() {
        Log.e("","In button add listener");
    }



}
于 2013-10-09T10:53:47.980 回答