gpt4 book ai didi

android - 尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.getRootView()'

转载 作者:行者123 更新时间:2023-11-30 00:29:12 27 4
gpt4 key购买 nike

我收到这个错误,

"Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' on a null object reference"

这是我的代码。

black.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View bView = findViewById(R.id.lin);
View root = bView.getRootView();
root.setBackgroundColor(Color.parseColor("#000000"));
}
});

我有两个 View ,一个叫overlay_view,另一个叫activity_main。我正在尝试更改 overlay_view 的颜色,但出现此错误。我有 setcontentView 到 activity_main,如果我将它切换到 overlay_view,它不会给我一个错误。但是我不想将 setContentView 切换到 overlay_view 那么还有另一种方法可以做到这一点吗?谢谢

编辑:我有一项添加了 overlay_view 的服务。该服务是从 mainactivity 调用的。这是在主要 Activity 中调用它的地方:

    public void sendMessage(){
Intent intent = new Intent(this, DrawOverAppsService.class);

startService(intent);
Intent intent1 = new Intent(this, MainActivity.class);
}

这是服务:

public class DrawOverAppsService extends Service {

public static final String TAG = "DrawOverAppsService";



View mOverlayView;

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();

Log.d(TAG, "onCreate");


final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
WindowManager.LayoutParams.FLAG_DIM_BEHIND,
PixelFormat.TRANSLUCENT);

// An alpha value to apply to this entire window.
// An alpha of 1.0 means fully opaque and 0.0 means fully transparent
params.alpha = 0.1F;

// When FLAG_DIM_BEHIND is set, this is the amount of dimming to apply.
// Range is from 1.0 for completely opaque to 0.0 for no dim.
params.dimAmount = 0.9F;

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);


LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


mOverlayView = inflater.inflate(R.layout.overlay_view, null);

wm.addView(mOverlayView, params);





}

@Override
public void onDestroy() {
super.onDestroy();

Log.d(TAG, "onDestroy");

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
wm.removeView(mOverlayView);


}
}

这是 overlay_view 的 xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF4081"
android:orientation="vertical"></LinearLayout>

最佳答案

您的问题是您在服务中创建了一个 View ,并希望在主 Activity 中引用它以更改其背景颜色。你的专线View bView = findViewById(R.id.lin ) 给你一个空值,因为系统找不到 R.id.linactivity_main . R.id.lin确实存在于 overlay_view这就是为什么在 setContentView() 中使用的 View 不会出现错误的原因。

服务类变量mOverlayView有对您想要的 View 的引用。我不知道findViewById()通过窗口管理器添加 View 的功能,因此您需要在 Activity 和服务之间实现连接。更改背景的服务代码如下所示:

View bView = mOverlayView.findViewById(R.id.lin);
if (bView != null) {}
View root = bView.getRootView();
root.setBackgroundColor(Color.parseColor("#000000"));
}

onClick Activity 的处理程序,您将通知服务更改背景。有几种方法可以处理这个问题,您可能已经有办法向服务发送命令。如果没有,看看startService

Every call to this method will result in a corresponding call to the target service's onStartCommand(Intent, int, int) method, with the intent given here. This provides a convenient way to submit jobs to a service without having to bind and call on to its interface.

您还可以设置本地广播管理器或绑定(bind)服务。搜索 "android activity service communication"有关处理此问题的替代方法的结果。

您可能还想熟悉 this issue在继续之前。

关于android - 尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.getRootView()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44765449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com