Android 是否将视图通知添加到父级?

Android 是否将视图通知添加到父级?,android,android-layout,android-view,android-custom-view,Android,Android Layout,Android View,Android Custom View,当我在Android中动态构建一个视图时,我必须通过调用 myLinearLayout.addView(myView); 我知道我可以监督视图组中通过卓越添加的任何孩子,但就我而言,我需要视图本身中的反馈。因此,我的问题是: 是否有类似于视图.onAddedToParent()回调或监听器的东西可以构建? 为了让事情变得非常清楚:我希望视图能够自行处理所有事情,我知道我可以在“父视图”中捕捉事件,然后通知视图有关事情,但这是不需要的。我只能改变看法 编辑:我刚刚发现,它似乎适用于大多数情况,但

当我在Android中动态构建一个
视图
时,我必须通过调用

myLinearLayout.addView(myView);
我知道我可以监督
视图组
中通过卓越添加的任何孩子,但就我而言,我需要
视图
本身中的反馈。因此,我的问题是:

是否有类似于
视图.onAddedToParent()
回调或监听器的东西可以构建?

为了让事情变得非常清楚:我希望视图能够自行处理所有事情,我知道我可以在“父视图”中捕捉事件,然后通知视图有关事情,但这是不需要的。我只能改变看法

编辑:我刚刚发现,它似乎适用于大多数情况,但我想知道这是否真的是正确的解决方案。我认为
视图
也可以从一个
视图组
传递到另一个
视图组
,而无需与窗口分离。因此,即使我愿意,我也不会收到任何活动。如果你有见识的话,能详细说明一下吗


提前谢谢

在我看来,你想要这样

创建视图

@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 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");
    }



}

您可以创建自定义视图,并在其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();
   }
}
如果要确保将customview添加到所需的正确视图组

@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();          
    }

}

根据Android源代码,除非先在其父视图上调用
removeView()
,否则视图无法移动到另一个布局,如果查看
removeView()
的代码,它会调用
removeViewInternal()
,这反过来会调用
removeViewInternal()
的重载,在线调用查看。dispatchDetachedFromWindow(),它基于Android源代码在线调用
onDetachedFromWindow()
。然后使用
addView()
添加视图,它以相同的方式调用
onAttachedToWindow()

正如我在问题中提到的,我有点犹豫。您确定从父视图中删除视图并直接添加到另一个视图时也会触发此操作吗?从消息来源来看,在我看来,可能有一些情况下,这可能不会正确触发(但我当然可能是错的)。对不起,这不是我想要的,我应该在我的问题中强调这一点,因此我现在对其进行了编辑。
视图是我想要修改的应用程序的唯一部分,它必须在应用程序内部进行
@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();          
    }

}