7

Ich habe eine Activity, die ActionBarActivity erweitert. Jedes Mal, wenn ich versuche, ein AlertDialog darin zu erstellen, stürzt an der der Zeile, in Dialog erstellt gibt diesen FehlerUnable erstellen alertDialog in ActionBarActivity

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

Aber ich bin schon mit Appcompat Thema Theme.AppCompat.Light.NoActionBar, wie ich bin mit Symbolleiste. Was könnte der Grund dafür sein? Hier ist meine Tätigkeit:

import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 



public class MyActivity extends ActionBarActivity { 

    Toolbar toolbar; 



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

     toolbar = (Toolbar)findViewById(R.id.tool_bar_comment); 
     setSupportActionBar(toolbar); 
       AlertDialog alertDialog; 
       alertDialog = new AlertDialog.Builder(getApplicationContext()).create(); 
       alertDialog.setTitle("Network error"); 
       alertDialog.setMessage("Check network connection and try again."); 
       alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         finish(); 
} 
     }); 
        alertDialog.show(); 


     } 
    } 

Hier ist mein Mainfest-Datei:

<application 
     android:name=".Networking.AppController" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

    ... 



     <activity 
     android:name=".MyActivity" 
     android:label="@string/myactivity" 
     > 
</activity> 
</application> 

und hier ist der styles.xml

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
</style> 

das android:theme Attribut auf die Aktivität Hinzufügen in MainFest hat überhaupt nicht geholfen.

<activity 
     android:name=".MyActivity" 
     android:label="@string/myactivity" 
     android:theme="@style/Theme.AppCompat.NoActionBar" 
     > 
+0

möglich Duplikat [Sie benötigen ein Theme.AppCompat Thema (oder Nachkommen) zu verwenden, mit diese Aktivität] (http://stackoverflow.com/questions/21814825/you-need-to-use-a-theme-appcompat-theme-oder-descendant-with-thisactivity) –

+1

Sie müssen nicht verwenden android: theme = "@ style/Theme.AppCompat.NoActionBar" einfach android: theme = "@ style/AppTheme" – arjunkn

Antwort

26

Ich kann nicht exakt den gleichen Fehler reproduzieren. Ich denke jedoch, dass das Problem der Kontext ist, der an AlertDialog.Builder-Konstruktor übergeben wird. In der Tat sollte ein Aktivitätskontext an ihn übergeben werden.

Versuchen Sie diese Zeile

   alertDialog = new AlertDialog.Builder(getApplicationContext()).create(); 

mit diesem mir ein

ersetzt
   alertDialog = new AlertDialog.Builder(this).create(); 

Bitte lassen Sie wissen, ob dies das Problem löst.

+0

Freut mich zu hören! Sie können diese [post] (http://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context) auch lesen, um ein besseres Verständnis darüber zu bekommen, wann der Aktivitäts- oder Anwendungskontext verwendet werden soll – Ajeje

-1

Verwenden AppCompatActivity statt ActionBarActivity

public class MyActivity extends AppCompatActivity 
+0

Es ändert sich nichts :-( –

10

löste ich dieses Problem durch den Import zu ändern:

android.support.v7.app.AlertDialog 

to 

android.app.AlertDialog 
2

ändern

new AlertDialog.Builder(this) 

zu

new AlertDialog.Builder(MainActivity.this) 
1

Wenn Sie Alertdialog in Adapter und in OnBindViewHolder() -Methode verwenden als im folgenden Code angezeigt:

@Override 
public void onBindViewHolder(final UserListAdapter.ViewHolder holder, final int position) { 

//long click for delete the record 
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View view) { 

     new AlertDialog.Builder(mContext) 

       .setMessage("Are you want to delete?") 
       .setPositiveButton("Yes",new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         Log.d(TAG, "onClick: yes"); 
        } 
       }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         Log.d(TAG, "onClick: no"); 
        } 
       }) 
       .setCancelable(false) 
       .show(); 
     return true; 
    } 
}); 

}

In diesem Fall neue AlertDialog.Builder (Kontext) ist nicht richtig

funktioniert so müssen Sie es ersetzen mit neuen AlertDialog.Builder (view.getContext()) . Das funktioniert für mich, ty.

0

Es kann durch Übergeben aufgelöst werden.Activityname.this anstelle von getApplicationContext(); wie in Ihrem Fall alertDialog = new AlertDialog.Builder(MyActivity.this)).create();

0

Fügen Sie diese Zeile in <application> in der AndroidManifest.xml Datei

android:theme="@style/Theme.AppCompat.Light"