Tidak dapat memulai dialog di kelas saya yang memperluas GcmListenerService

Saya mencoba membuat dialog ketika saya menerima jenis pesan tertentu di kelas saya yang meluas 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();
        }

tetapi saya mendapat pengecualian java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

di baris ini final AlertDialog alertDialog = builder.create();

Aktivitas utama saya

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
}

Manifes.xml saya

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

Sumber daya gaya saya

<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>

Di mana saya melakukannya dengan cara yang salah?


person Edijae Crusar    schedule 02.12.2015    source sumber
comment
Mengapa Anda mencoba menggunakan AppCompatActivity (yang digunakan untuk aktivitas dengan bilah tindakan) ketika Anda memiliki tema NoActionBar?   -  person Tim    schedule 02.12.2015
comment
@TimCastelijns karena saya perlu setSupportActionBar dan saya tidak dapat melakukannya dengan memperluas Aktivitas   -  person Edijae Crusar    schedule 02.12.2015
comment
@TimCastelijns atau adakah cara saya bisa setSupportActionBar tanpa memperluas AppCompatActivity   -  person Edijae Crusar    schedule 02.12.2015
comment
Biasanya, ketika Anda ingin menggunakan bilah tindakan, Anda menggunakan tema selain NoActionBar, melihat namanya, alasannya harus jelas   -  person Tim    schedule 02.12.2015


Jawaban (1)


Saya harus memperluas AppCompatActivity dalam aktivitas saya karena saya ingin menggunakan metode setSupportActionBar() untuk menyetel bilah alat saya sebagai bilah tindakan.

Untuk mengatasi masalah ini, saya melakukan beberapa perubahan di kelas saya yang meluas GcmListenerService

aku berubah

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

to

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

Ini adalah kelas saya yang memperluas layanan 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();
    }

` gaya saya digunakan oleh aktivitas saya dan AlertDialog.Builder saya

<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>
person Edijae Crusar    schedule 02.12.2015
comment
Mendapatkan kesalahan berikut: Tidak dapat menambahkan jendela Android.view.ViewRootImpl$W@2728b31 -- izin ditolak untuk jendela ini, ketikkan saran? - person Moe Howard; 16.12.2015
comment
Ah mengerti: Keren! Berhasil untuk saya... Perlu menambahkan: ‹uses-permission android:name=android.permission.SYSTEM_ALERT_WINDOW /› seperti yang dicatat oleh pria ini: stackoverflow.com/questions/18400539/ - person Moe Howard; 16.12.2015
comment
@MoeHoward, saya berada jauh, tetapi ketika saya kembali, saya menemukan bahwa Anda memecahkan masalah. Besar. jika jawaban ini membantu Anda, jangan lupa untuk upvote :) - person Edijae Crusar; 17.12.2015