0

Am пытается создать диалог, когда я получить определенный тип сообщения в моем классе, который простирается GcmListenerServiceНевозможно начать диалог в моем классе, который расширяет GcmListenerService

public class MyGcmListenerService extends GcmListenerService { 

@Override 
public void onMessageReceived(String from, Bundle data) { 

    final String senderName = data.getString("sender"); 
    final String message = data.getString("message"); 

    if(senderName != null && senderName.equals("XXX")){ 
     final AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     builder.setMessage(message) 
       .setTitle("Alert!") 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.dismiss(); 
        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         // User cancelled the dialog 
         dialog.dismiss(); 
        } 
       }); 
     try { 
      new Thread() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        final AlertDialog alertDialog = builder.create(); 
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
        alertDialog.show(); 
        Looper.loop(); 

       } 
      }.start(); 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 

, но я получаю исключениеjava.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

на этой линииfinal AlertDialog alertDialog = builder.create();

Мой Главный деятельность

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final Toolbar toolbar =(Toolbar) findViewById(R.id.mainActivityBar); 
    setSupportActionBar(toolbar); 
    //other statements and methods here 
} 

Мой manifest.xml

<activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" 
     android:theme="@style/mainActivityTheme"> 
    </activity> 

Мой стиль ресурс

<style name="mainActivityTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:textColorSecondary">@android:color/white</item> 
    <item name="android:windowActionBar">false</item> 
</style> 

Где я делаю это неправильный путь?

+0

Почему вы пытаетесь использовать AppCompatActivity (который используется для мероприятий с панели действий), если у вас есть тема NoActionBar? –

+0

@TimCastelijns, потому что мне нужно «setSupportActionBar», и я не могу этого сделать, расширив Activity –

+0

@TimCastelijns или есть способ, которым я могу 'setSupportActionBar' без расширения' AppCompatActivity' –

ответ

0

мне пришлось продлить AppCompatActivity в моей деятельности, потому что я хотел использовать setSupportActionBar() метод, чтобы установить мою панель как ActionBar.

Чтобы решить эту проблему, я сделал некоторые изменения в моем классе, который расширяет GcmListenerService

я изменил

final AlertDialog.Builder builder = new AlertDialog.Builder(this); 

в

final AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.mainActivityTheme)); 

Это мой класс, который расширяет gcmlistener услуги

public class MyGcmListenerService extends GcmListenerService { 

@Override 
public void onMessageReceived(String from, Bundle data) { 
final String senderName = data.getString("sender"); 
final String message = data.getString("message"); 

if(senderName != null && senderName.equals("XXX")){ 
    final AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.mainActivityTheme)); 

    builder.setMessage(message) 
      .setTitle("Alert!") 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.dismiss(); 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
        dialog.dismiss(); 
       } 
      }); 
    try { 
     new Thread() { 
      @Override 
      public void run() { 
       Looper.prepare(); 
       final AlertDialog alertDialog = builder.create(); 
       alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
       alertDialog.show(); 
       Looper.loop(); 

      } 
     }.start(); 
    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 

` мой стиль, используемый моей деятельности и моей AlertDialog.Builder

<style name="mainActivityTheme" parent="Theme.AppCompat.NoActionBar"> 
<item name="windowActionBar">false</item> 
<item name="android:windowNoTitle">true</item> 
<item name="android:textColorSecondary">@android:color/white</item> 
<item name="android:windowActionBar">false</item> 
</style> 
+0

Получение следующей ошибки: «Невозможно добавить окно [email protected] - разрешение отклонено для этого типа окна« любые предложения? –

+0

Ах получилось: Круто! Работал для меня ... Необходимо, чтобы добавить: <использует-разрешение андроида: имя = «android.permission.SYSTEM_ALERT_WINDOW» /> как отмечено этим чуваком: http://stackoverflow.com/questions/18400539/windowmanagerbadtokenexception -unable-to-add-window –

+0

@MoeHoward я был далеко, но когда я вернулся, я обнаружил, что вы решили проблему. Великий.если бы этот ответ помог вам, не забудьте его перенести :) –

Смежные вопросы