2017-09-01 1 views
0

Comme le dit le titre, je continue à obtenir l'erreur You need to use a Theme.AppCompat theme (or descendant) with this même si J'utiliseTheme.AppCompat .l'erreur « Vous devez utiliser un thème Theme.AppCompat (ou descendant) avec ce » même si je suis en utilisant Theme.AppCompat

D'abord, voici la classe qui devient l'erreur (NOTE: Je marqué la ligne où l'erreur se produit avec un commentaire):

public class CustomSimpleCursorAdapter extends SimpleCursorAdapter { 

    private Context context; 
    private Cursor cursor; 
    private MainActivity mainActivity; 

    public CustomSimpleCursorAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flags, MainActivity mainActivity) { 
     super(context, layout, cursor, from, to, flags); 
     this.context = context; 
     this.cursor = cursor; 
     this.mainActivity = mainActivity; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 

     // Grab each row as it is pulled from the db. 
     DatabaseHelper dbHelper = new DatabaseHelper(context); 
     View row = super.getView(position, convertView, parent); 

     cursor.moveToPosition(position); 
     final Integer id = cursor.getInt(cursor.getColumnIndex("_id")); 
     final String personID = cursor.getString(cursor.getColumnIndex("personid")); 

     // Set alternating rows to different colors. 
     if(position % 2 == 0){ 
      row.setBackgroundColor(Color.parseColor(Constants.WHITE)); 
     } else { 
      row.setBackgroundColor(Color.parseColor(Constants.LIGHTGREY)); 
     } 

     // Make the delete button clickable. 
     Button deletePersonButton = (Button)row.findViewById(R.id.remove_person); 
     deletePersonButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AlertDialog.Builder deleteDialogBuilder = new AlertDialog.Builder(context); 
       deleteDialogBuilder.setTitle("Delete Person " + personID + "?"); 
       deleteDialogBuilder.setMessage("This process is IRREVERSABLE!"); 
       deleteDialogBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         DatabaseHelper databaseHelper = new DatabaseHelper(context); 
         databaseHelper.deletePerson(personID); 
         mainActivity.dataChanged(); 
         Toast.makeText(context, "Person " + personID + " (ID: " + Integer.toString(id) + ") Deleted", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       deleteDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
       AlertDialog deleteDialog = deleteDialogBuilder.create(); 
       deleteDialog.setIcon(R.drawable.warning); 
       deleteDialog.show(); // This is where I get the error 
      } 
     }); 

     return row; 
    } 
} 

Voici où j'appelle CustomSimpleCursorAdapter:

public class Home extends Fragment{ 

    private MainActivity mainActivity; 
    private View rootView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     rootView = inflater.inflate(R.layout.home, container, false); 
     mainActivity = (MainActivity)getActivity(); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View rootView, Bundle savedInstanceState) { 
     super.onViewCreated(rootView, savedInstanceState); 
     drawThePersonView(); 
    } 

    public void drawThePersonView(){ 
     Context context = mainActivity.getApplicationContext(); 
     DatabaseHelper myDBHelper = new DatabaseHelper(context); 
     Cursor personCursor = myDBHelper.getUndeletedCasualtiesCursor(); 
     String[] fromColumns = {"_id","personID","location","status"}; 
     int[] toViews = {R.id.person_number_textview, R.id.person_personID_textview, R.id.person_location_textview, R.id.person_status_textview}; 
     CustomSimpleCursorAdapter mySimpleCursorAdapter = new CustomSimpleCursorAdapter(context, R.layout.person_layout, personCursor, fromColumns, toViews, 0, mainActivity); 

     ListView myListView = (ListView) rootView.findViewById(R.id.person_row); 

     // Draw the list 
     myListView.setAdapter(mySimpleCursorAdapter); 

     myDBHelper.close(); 
    } 
} 

Et voici mon fichier AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.domain"> 

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:name="com.domain.MyApplication"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan|stateHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".forms.Form01" 
      android:label="@string/form_01_title" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan|stateHidden" /> 
     <activity 
      android:name=".forms.Form02" 
      android:label="@string/form_02_title" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan|stateHidden" /> 
     <activity 
      android:name=".forms.Form03" 
      android:label="@string/form_03_title" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan|stateHidden" /> 
     <activity 
      android:name=".AddPerson" 
      android:label="@string/title_activity_add_person" 
      android:theme="@style/AppTheme.NoActionBar" /> 
     <activity 
      android:name=".AddItem" 
      android:label="@string/title_activity_add_item" 
      android:theme="@style/AppTheme.NoActionBar" /> 

    </application> 

</manifest> 

Dans le manifeste ci-dessus que j'ai posté, il n'y a pas de référence à Theme.AppCompat, mais j'ai fait ce changement avant de poster ici. J'ai changé un à la fois, puis je les ai tous changé de Theme.AppCompat et j'ai toujours reçu l'erreur à chaque fois même si J'utiliseTheme.AppCompat.

C'est le logcat de l'erreur:

09-01 13:07:09.457 26231-26231/com.domain E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.domain, PID: 26231 
    java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 
     at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:309) 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:278) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:252) 
     at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:76) 
     at android.support.v7.app.AlertController.installContent(AlertController.java:216) 
     at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:240) 
     at android.app.Dialog.dispatchOnCreate(Dialog.java:373) 
     at android.app.Dialog.show(Dialog.java:274) 
     at com.domain.adapters.CustomSimpleCursorAdapter$1.onClick(CustomSimpleCursorAdapter.java:57) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5258) 
     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:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Toutes les suggestions?

Merci!

+0

pouvez-vous poster la ligne comment vous créez l'objet de 'CustomSimpleCursorAdapter' et le réglage à listview? – chandil03

+0

@ chandil03 J'ai ajouté le code que vous avez demandé. Merci. – Brian

+0

Copie possible de [Vous devez utiliser un thème Theme.AppCompat (ou un descendant) avec cette activité] (https://stackoverflow.com/questions/21814825/you-need-to-use-a-theme-appcompat-theme -ou-descendant-avec-cette-activité) – Ibrahim

Répondre

1

Il vous suffit de remplacer getApplicationContext() par getContext().

public void drawThePersonView(){ 
     Context context = getContext(); 
     ... 
     // your stuff 
     ... 
} 

Je n'ai pas testé ce code. S'il vous plaît tester et laissez-moi savoir.

Pour plus lire Understanding Context In Android Application.

J'espère que ça aide.

+0

Bien que cela fonctionne, j'ai eu des problèmes avec le contexte étant nul quand je réoriente l'appareil.C'est pourquoi je suis passé à getApplicationContext() en premier lieu. – Brian

+0

Eh bien, si vous n'utilisez pas plusieurs mises en page pour votre fragment/activité, je suggère d'ajouter 'android: configChanges =" keyboardHidden | orientation "' dans votre activité et de gérer si vous avez un cas d'utilisation lorsque l'on change 'onConfigChanges () 'méthode. Alors votre contexte ne sera pas nul. – chandil03

0

Ce problème est déjà arrivé avec moi Ce fut à cause de l'utilisation constructeur de dialogue d'alerte dans une activité avec un style non (Theme.AppCompat) J'ai changé le style à Theme.AppCompat mais ne fonctionne toujours pas j'ai remarqué que studio Android ont des problèmes lorsque vous modifiez la style d'une activité donc je vous recommande de copier le code de java et xml liés à votre activité et supprimer l'activité puis recréer à nouveau avec les mêmes java et xml mais un style de Theme.AppCompat Une autre solution qui peut fonctionner est qu'au lieu de faire le dialogue d'alerte vous pouvez faire une activité du dialogue que vous voulez construire il est plus custimizable et dans le fichier manifest vous pouvez définir le thème à l'activité de dialogue comme ceci android:theme="@style/Base.Theme.AppCompat.Dialog" afin que l'activité que vous avez créé comme un dialogue est affichée comme un dialogue

+0

C'est ce que vous venez de résoudre pour résoudre votre problème en faisant tout ce que vous pouviez sans savoir exactement quel était le problème. Vous si vous voulez connaître le vrai problème lire la réponse ci-dessus. – chandil03