- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我必须使用 OnGlobalLayoutListener
对象,然后删除监听器,我遇到了不推荐使用的方法的问题,我使用以下代码解决了这个问题。
protected void onCreate(Bundle savedInstanceState) {
final LinearLayout llTotal = (LinearLayout) findViewById(R.id.mmc_ll);
ViewTreeObserver vto = llTotal.getViewTreeObserver();
if(vto.isAlive()){
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//
// mycode
//
if (Build.VERSION.SDK_INT<16) {
removeLayoutListenerPre16(llTotal.getViewTreeObserver(),this);
} else {
removeLayoutListenerPost16(llTotal.getViewTreeObserver(), this);
}
}
});
}
super.onCreate(savedInstanceState);
}
@SuppressWarnings("deprecation")
private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeGlobalOnLayoutListener(listener);
}
@TargetApi(16)
private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
observer.removeOnGlobalLayoutListener(listener);
}
正确吗?有更好的处理兼容性的方法吗?
使用 API 10 在模拟器中运行代码我在 LogCat 中收到以下警告
04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
我可以忽略它们吗?我必须以某种方式修复它们?
最佳答案
我在我的项目中使用它:
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
看起来和你的很像。在不同的设备(4.2.2 和 2.3.3)上测试并且运行完美。似乎这是唯一的方法....如果您发现其他任何东西,我想知道它。祝你好运
2020 年编辑这种方法非常非常过时。我希望您将代码移至 Kotlin。现在我们可以在使用 ktx 库时使用 doOnPreDraw 函数。 https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnPreDraw(kotlin.Function1)
关于android - OnGlobalLayoutListener : deprecation and compatibility,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16189525/
我以编程方式创建了几个布局,我需要获取其中一个的宽度,重新计算该值并进行更改。我在 onGlobalLayoutListener 中执行的所有这些操作。但是当我设置一个新的宽度值时,他并没有改变。 p
我正在尝试在 Activity 加载完成后计算 View 的 x,y 位置。我所做的是 view.postDelayed(runnable, 2000) 工作正常。 code reviewer 对此不
我在 onCreate() 方法中使用 ViewTreeObserver.OnGlobalLayoutListener 来获取布局的宽度。它工作得很好,但是当我在 onGlobalLayout() 中
谁能用 C# 向我解释这段 Java 代码,因为我在 Android 上使用 Mono?例如,我在 Android 的 Mono 中找不到 OnGlobalLayoutListener。 在 Andr
我希望能够使用动画扩展我的 ListView 中的行。因此我需要知道正在扩展的 View 的高度。我在 ArrayAdapter 的 getView() 方法中使用它: mDetailsView.ge
我必须使用 OnGlobalLayoutListener 对象,然后删除监听器,我遇到了不推荐使用的方法的问题,我使用以下代码解决了这个问题。 protected void onCreate(Bund
我在两个 TextView 的父 View 上使用 viewTreeObserver.addOnGlobalLayoutListener , onGlobalLayout 以获得一个的宽度和另一个的高
我正在做一个非常简单的功能,比如在 TextView 的末尾添加省略号。 我可以在 onMeasure()、onLayout() 和 OnGlobalLayoutListener() 调用中添加该功能
在我正在构建的应用程序中,有一个 ListView ,实际上是一个带有子列表的可扩展 ListView - 并且有两种情况,具体取决于单击的组列表项:有时有一个子列表项,有时有两个子列表项.当单击包含
我在我的应用程序中显示一个带有自定义项的 ListView。自从我使用来自 47deg found here 的 android-swipelistview 以来,自定义项目已经做了很多工作。 . 因
我有一个 RecyclerView,我在其 View 持有者构造函数中添加了一个 onGlobalLayoutListener,如下所示 public CustomViewHolder(final V
根据文档,第一个是 当 View 的布局边界由于布局处理而改变时调用回调的接口(interface)定义。 第二个是 当全局布局状态或 View 树中 View 的可见性发生变化时调用回调的接口(in
我有一个普通的基本回收器 View 及其适配器。 在单个回收器 View 行中,我有一个 float 的 textView。 textView 宽度长度应按比例固定,即 30 % 的屏幕。 我想放置
我是一名优秀的程序员,十分优秀!