7

Ho un Activity che si estende ActionBarActivity. Ogni volta che provo a creare un AlertDialog in esso, blocca alla riga in cui si crea dialogo dando questo erroreImpossibile creare alertDialog in ActionBarActivity

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

ma sto già utilizzando Appcompat tema Theme.AppCompat.Light.NoActionBar come sto usando barra degli strumenti. Quale potrebbe essere la ragione di questo? Ecco la mia attività:

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(); 


     } 
    } 

Ecco il mio file Mainfest:

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

e, qui è la styles.xml

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

Aggiungendo l'attributo android:theme per l'attività in MainFest non ha aiutato affatto.

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

possibile duplicato del [È necessario utilizzare un tema Theme.AppCompat (o discendente) con questa attività] (http://stackoverflow.com/questions/21814825/you-need-to-use-a-theme-appcompat-theme-or-descendant-with-this-activity) –

+1

Non è necessario utilizzare android: theme = "@ style/Theme.AppCompat.NoActionBar" usa semplicemente android: theme = "@ style/AppTheme" – arjunkn

risposta

26

non ho potuto riprodurre lo stesso errore esatto. Tuttavia, penso che il problema sia il contesto passato al costruttore AlertDialog.Builder. In effetti, un contesto di attività dovrebbe essere passato ad esso.

provare a sostituire questa linea

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

con questo

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

Per favore fatemi sapere se questo risolve il problema.

+0

Felice di sentirlo! Puoi anche leggere questo [post] (http://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context) per ottenere una migliore comprensione su quando utilizzare il contesto di attività o applicazione – Ajeje

-1

Uso AppCompatActivity invece di ActionBarActivity

public class MyActivity extends AppCompatActivity 
+0

Non cambia nulla :-( –

10

Ho risolto questo problema modificando l'importazione:

android.support.v7.app.AlertDialog 

to 

android.app.AlertDialog 
2

Change

new AlertDialog.Builder(this) 

a

new AlertDialog.Builder(MainActivity.this) 
1

Se si utilizza alertDialog in adattatore e in OnBindViewHolder() Metodo mostrato nel seguente codice:

@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 questo caso nuova AlertDialog.Builder (contesto) non è corretto funzionamento

quindi è necessario sostituirlo con nuova AlertDialog.Builder (view.getContext()) . Questo funziona per me, ty.

0

Può essere risolto passando.Activityname.this al posto di getApplicationContext(); come nel tuo caso alertDialog = new AlertDialog.Builder(MyActivity.this)).create();

0

aggiungere questa linea al vostro <application> nel file AndroidManifest.xml

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