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