簡體   English   中英

在半透明活動中顯示警報對話框

[英]Showing an alert dialog in a translucent activity

因此,我有一個要嘗試顯示警報對話框的服務。 這似乎是不可能的,所以我決定在我的應用程序的半透明活動中展示它。 但是,我收到此錯誤:

02-01 10:29:18.336 3806-3806/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.application.sweetiean.dummylocationupdates, PID: 3806
                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.application.sweetiean.dummylocationupdates/com.application.sweetiean.dummylocationupdates.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
                                                 at android.app.ActivityThread.access$800(ActivityThread.java:144)
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:135)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
                                              Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                 at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:355)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:324)
                                                 at android.support.v7.app.AppCompatDelegateImplV9.onPostCreate(AppCompatDelegateImplV9.java:172)
                                                 at android.support.v7.app.AppCompatActivity.onPostCreate(AppCompatActivity.java:101)
                                                 at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1186)
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2280)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
                                                 at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                 at android.os.Looper.loop(Looper.java:135) 
                                                 at android.app.ActivityThread.main(ActivityThread.java:5221) 
                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                 at java.lang.reflect.Method.invoke(Method.java:372) 
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

這是我的主要活動課:

package com.application.sweetiean.dummylocationupdates;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.ContextThemeWrapper;
import android.view.WindowManager;
import android.widget.Toast;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;

import static com.application.sweetiean.dummylocationupdates.R.style.dialog;

public class MainActivity extends AppCompatActivity {
    LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);

    Toast.makeText(this, "Background Services starting...", Toast.LENGTH_SHORT).show();
    // use this to start and trigger a service
    Intent i= new Intent(this, LocationUpdateService.class);
    /*this.startService(i);
    finish();*/

    // potentially add data to the intent
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    // check if enabled and if not send user to the GSP settings
    if (!enabled) {
        showSettingsAlert();
    } else {
        this.startService(i);
        finish();
    }
    //finish();
}

public void showSettingsAlert() {
    //AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getApplication(), dialog));
    builder.setTitle("GPS Settings");
    builder.setMessage("GPS is not enabled. Do you want to enable it?");
    //AlertDialog alert =  builder.create();

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    });

    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            //stopSelf();
        }
    });

    AlertDialog alert =  builder.create();

    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    alert.show();

}

}

我在服務中使用了融合的位置提供程序API,我想確保用戶在服務運行之前打開其GPS。 我的清單中已經有這個: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

並非完全相關的問題,但它會得到答案 。Google PlayStore對全天運行位置服務的應用有何政策? 由於我正在使用FusedLocationProvider API,因此Playstore會拒絕我的應用程序,因為這要求GPS整天運行,無論是在前台還是在后台,甚至是應用程序被殺死

像這樣做 :

  AlertDialog.Builder builder = new AlertDialog.Builder(
            MainActivity.this);
  builder.setTitle("GPS Settings");
  builder.setMessage("GPS is not enabled. Do you want to enable it?");
  AlertDialog alertDialog = builder.create();
  alertDialog.show();

對於第一個exception嘗試以下操作:

在您的styles.xml創建此主題

    <?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="@style/Theme.AppCompat">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>

將此用作:

<activity android:name=".MainActivity" android:theme="@style/Theme.Transparent">
</activity>

對於第二個查詢,我認為這不會給您在Google Play中的應用造成問題。

但是最好的方法是在應用程序被銷毀時停止所有后台服務

@Override
protected void onDestroy() {
    super.onDestroy();
    mGoogleApiClient.disconnect();
}

從日志

無法啟動活動java.lang.IllegalStateException:您需要與此活動一起使用Theme.AppCompat主題(或后代)。

嘗試Theme.AppCompat主題(或后代)

在這種情況下,也請避免使用融合位置,而應使用位置管理器

LocationManager管理器=(LocationManager)getSystemService(Context.LOCATION_SERVICE);

manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM