如何处理自定义 android 视图/小部件的可见性更改

Posted

技术标签:

【中文标题】如何处理自定义 android 视图/小部件的可见性更改【英文标题】:How to handle visibility changes for a custom android view/widget 【发布时间】:2013-05-08 14:17:38 【问题描述】:

我在 android 中编写了一个自定义视图。当此视图的可见性发生更改时,我需要进行一些处理。当视图/小部件的可见性改变时,是否有一些监听器被调用?

编辑:

我知道如何改变可见性,想知道当我们在视图上设置可见性时是否有一个监听器被调用!

【问题讨论】:

请多解释一下 【参考方案1】:

您想在您的自定义视图类中进行该处理吗? 如果是这样,那为什么不直接重写 setVisibility() 方法,调用 super(),然后进行自定义处理呢?

【讨论】:

将此标记为答案,因为此解决方案是在黑带详细说明之前提供的 这种方式不行。例如,如果您将视图的父级设置为不可见,则该视图的可见性属性仍然可以可见。只要实践一下,你就会发现这是真的。 这是一个非常有限的解决方案。 @William 下面的回答更笼统。此外,窗口还有一个 onWindowVisibilityChanged。【参考方案2】:

我知道如何更改可见性,想知道是否有 当我们在视图上设置可见性时调用的监听器!

您必须继承您的view/widget 并覆盖setVisibility,并注册一个您将在其上接收通知的接口。例如:

public class MyView extends View 

  public interface MyListener 
    public void onSetVisibilityCalled();
  

  public void registerListener(MyListener myListener) 
    this.mListener = myListener;
  

 public void setVisibility (int visibility) 
   super.setVisibility(visibility);
   if (mListener != null)
     mListener.onSetVisibilityCalled();
 


【讨论】:

当父视图的可见性改变时,不一定会调用setVisibility。【参考方案3】:

您必须对要添加侦听器的视图进行子类化。然后您应该覆盖onVisibilityChanged 而不是setVisibilityonVisibilityChanged 会在视图的可见性因任何原因发生更改时触发,包括更改祖先视图时。

如果您希望在您的View 的可见性发生变化时通知不同的类,您将需要一个接口。

例子:

public class MyView extends View 
  private OnVisibilityChangedListener mVisibilityListener;

  public interface OnVisibilityChangedListener 
    // Avoid "onVisibilityChanged" name because it's a View method
    public void visibilityChanged(int visibility);
  

  public void setVisibilityListener(OnVisibilityChangedListener listener) 
    this.mVisibilityListener = listener;
  

 protected void onVisibilityChanged (View view, int visibility) 
   super.onVisibilityChanged(view, visibility);

   // if view == this then this view was directly changed.
   // Otherwise, it was an ancestor that was changed.

   // Notify external listener
   if (mVisibilityListener != null)
     mVisibilityListener.visibilityChanged(visibility);

   // Now we can do some things of our own down here
   // ...
 

【讨论】:

【参考方案4】:

要更改小部件的可见性,请使用widget.setVisibility(View.Visible)widget.setVisibility(View.Invisible) 方法。

【讨论】:

我知道如何改变可见性,想知道当我们在视图上设置可见性时是否有一个监听器被调用!

以上是关于如何处理自定义 android 视图/小部件的可见性更改的主要内容,如果未能解决你的问题,请参考以下文章

如何处理自定义结果视图的 NSFetchedResultsControllerDelegate 更新

如何处理自定义 UITableViewCell XIB 中的两个视图?

如何处理自定义 UIViewController 委托 (ARC)?

如何处理自定义技能中用户的“是”/“否”响应?

iOS - 如何处理自定义表格单元格中的方向变化

使用 pd.read_clipboard 复制数据帧时如何处理自定义命名索引?