I am getting this error,
"Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' on a null object reference"
Here is my code.
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"));
}
});
I have two views, one called overlay_view and the other activity_main. I am trying to change the color of overlay_view but I am getting this error. I have the setcontentView to activity_main, and if I switch it to overlay_view it does not give me a error. However I do not want to switch the setContentView to overlay_view so is there another way to do this? Thanks
Edit: I have a service which adds in overlay_view. The service is called from the mainactivity. Here is where it is called from in the main activity:
public void sendMessage(){
Intent intent = new Intent(this, DrawOverAppsService.class);
startService(intent);
Intent intent1 = new Intent(this, MainActivity.class);
}
And here is the service:
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);
}
}
This is the xml for overlay_view:
<?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>
Your issue is that you create a view in a service and want to reference it in the main activity to change its background color. Your line
View bView = findViewById(R.id.lin
) is giving you a null value because the system cannot findR.id.lin
inactivity_main
.R.id.lin
does exist inoverlay_view
and that is why you don't get the error with that view used in setContentView().The service class variable
mOverlayView
has a reference to the view you want. I don't know offindViewById()
functionality for views added via the window manager, so you will need to implement a connection between the activity and the service. The service code to change the background will look something like this:In the
onClick
handler of the activity, you will notify the service to change the background. There are several ways to handle this and you may already have a way to send commands to the service. If not, take a look at startServiceYou can also set up a local broadcast manager or bind the service. Search for "android activity service communication" for results on alternate ways to handle this.
You may also want to familiarize yourself with this issue before proceeding.