12

Quindi ho eseguito una ripresa con il Material Design di Android Preview L. Ho importato sia le librerie CardView e RecyclerView.Utilizzo di CardView e RecyclerView nei file di layout genera un'eccezione

Uso la versione di anteprima di Android Studio 0.8.0. Sono installati i pacchetti SDK più recenti.

Una volta che li utilizzo nei file di layout, tuttavia, l'anteprima genera un'eccezione per entrambi.

Ecco l'eccezione per il CardView:

java.lang.ClassFormatError: Illegal field name "CardView.Dark" in class android/support/v7/cardview/R$style 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:792) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:635) 
at org.jetbrains.android.uipreview.ProjectClassLoader.findClass(ProjectClassLoader.java:63) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:411) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at android.support.v7.widget.CardView.initialize(CardView.java:69) 
at android.support.v7.widget.CardView.<init>(CardView.java:60) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:375) 
at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:100) 
at com.android.tools.idea.rendering.LayoutlibCallback.loadView(LayoutlibCallback.java:172) 
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207) 
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:132) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:478) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:381) 
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:395) 
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:329) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332) 
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:575) 
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:564) 
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932) 
at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:564) 
at com.android.tools.idea.rendering.RenderService.render(RenderService.java:691) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:586) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1900(AndroidLayoutPreviewToolWindowManager.java:80) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6$1.run(AndroidLayoutPreviewToolWindowManager.java:528) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178) 
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6.run(AndroidLayoutPreviewToolWindowManager.java:523) 
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320) 
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310) 
at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254) 
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269) 
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227) 
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217) 
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238) 
at com.intellij.util.Alarm$Request$1.run(Alarm.java:327) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:724) 

E qui è l'eccezione per RecyclerView:

java.lang.NullPointerException 
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1310) 
at android.view.View.measure(View.java:16987) 
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:722) 
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:458) 
at android.view.View.measure(View.java:16987) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5257) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:314) 
at android.view.View.measure(View.java:16987) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5257) 
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447) 
at android.view.View.measure(View.java:16987) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5257) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1083) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:615) 
at android.view.View.measure(View.java:16987) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5257) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
at android.view.View.measure(View.java:16987) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:875) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
at android.view.View.measure(View.java:16987) 
at com.android.layoutlib.bridge.impl.RenderSessionImpl.measureView(RenderSessionImpl.java:621) 
at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:521) 
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:331) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332) 
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:575) 
at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:564) 
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932) 
at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:564) 
at com.android.tools.idea.rendering.RenderService.render(RenderService.java:691) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:586) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1900(AndroidLayoutPreviewToolWindowManager.java:80) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6$1.run(AndroidLayoutPreviewToolWindowManager.java:528) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178) 
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212) 
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171) 
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$6.run(AndroidLayoutPreviewToolWindowManager.java:523) 
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320) 
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310) 
at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254) 
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269) 
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227) 
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217) 
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238) 
at com.intellij.util.Alarm$Request$1.run(Alarm.java:327) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:724) 

Questo rende la costruzione di layout quasi impossibile l'utilizzo di questi due (incredibile) View s, che Sono più curioso di

Esiste già una soluzione, oppure si tratta di un comportamento effettivamente previsto visto che sono "personalizzati" View s, in un certo senso?

+0

Qualcun'altro ha chiesto del 'CardView.Dark' uno ieri, IIRC. – CommonsWare

+1

Il fatto è che non sto menzionando il tema 'Dark' ovunque. Sto solo dichiarando il tag 'android.support.v7.widget.CardView'. No 'Dark' (potrebbe essere un tema predefinito). Hai avuto problemi con @CommonsWare? – tolgap

+1

Non ci ho ancora giocato. Ricordo solo di aver visto un accenno a un problema come questo, oggi, qui su SO. – CommonsWare

risposta

19

Questo è un bug in Android Studio. Lo strumento di anteprima non sa come inizializzare i widget. Credo di sì, perché la stessa eccezione viene generata dalla tua app se ti dimentichi di chiamare recyclerView.setLayoutManager() nel tuo codice.

+0

Hai ragione, mi sono imbattuto in [questo] (https://sites.google.com/a/android.com/tools/recent/androidstudiobetareleased) link. Android Studio sembra aver aggiornato 2 ore fa per questo motivo. – tolgap

+0

Ho installato l'aggiornamento. RecyclerView non è ancora visualizzato nell'anteprima. Invece, mostra almeno un messaggio di errore più significativo: "Il nuovo RecyclerView non funziona ancora in Studio. Stiamo lavorando su una correzione.(Apri numero 72117, Mostra eccezione) "https://code.google.com/p/android/issues/detail?id=72117 – user7610

+0

Il bug report di CardView sembra essere questo: https://code.google.com/p/android/issues/detail? id = 79071, che si collega anche a questo cambiamento in Android Studio: https://android-review.googlesource.com/#/c/113416/ – personne3000

8

Sto usando Eclipse e ho affrontato lo stesso problema. Come suggerito dall'utente7610, è necessario chiamare recyclerView.setLayoutManager() per superare questo.

Ecco come ho risolto ..

Creare una variabile membro ..

RecyclerView.LayoutManager mLayoutManager; 

In onCreate() o onCreateView()

recyclerView = (RecyclerView) view 
       .findViewById(R.id.business_recycler_view); 
recyclerView.setHasFixedSize(true); 

mLayoutManager = new LinearLayoutManager(getActivity()); 
recyclerView.setLayoutManager(mLayoutManager); 

Questo risolto il mio NullPointerException.

+0

Grazie per la spiegazione dettagliata –

+0

Felice che abbia aiutato !!! Felice Coding :) –

0

Se qualcuno si trova ad affrontare lo stesso problema per la vista Recycler all'interno uso frammento di questo codice

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.fragment_timeline, container, false); 

     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view); 

     // use this setting to improve performance if you know that changes 
     // in content do not change the layout size of the RecyclerView 

     mRecyclerView.setHasFixedSize(true); 
     // use a linear layout manager 
     mLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 


     String[] abc = {"hi","how are you","this is recycler"}; 
     // specify an adapter (see also next example) 
     mAdapter = new RecyclerViewAdapter(abc); 
     mRecyclerView.setAdapter(mAdapter); 
     return rootView; 
    } 
2

ho trovato problema simile. Come tale se si gonfia solo il layout che consiste in RecyclerView. Mentre si fa setcontentView dà errore perché il gestore di layout non è impostato per Recyclerview Defined in Layout file.

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.searchResultsList); 
LinearLayoutManager layoutmanager = new LinearLayoutManager(this); 
layoutmanager.setOrientation(LinearLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(layoutmanager); 
Problemi correlati