2016-06-10 4 views
4

저는 처음으로 AppCompatActivity을 사용하지 않고 새로운 머티리얼 테마를 사용하여 실험을하고 있습니다. 나는 특정 응용 프로그램에서 하위 호환성을 필요로하지 않으므로 Marshmallow 건물입니다.DrawerLayout, NavigationView 및 android : Theme.Material.Light 호환되지 않음?

초기 활동의 의도는 actionbar이고 왼쪽 탐색 메뉴는 AppCompat과 같습니다. 그러나 기본 테마를 더 이상 AppCompat 테마를 사용하지 않도록 설정하고 레이아웃을 변경하고 기본 활동을 크랭크하려고하면 활동의 onCreate() 메소드가 완료된 후 IndexOutOfBoundsException이 발생합니다. 예외는 내부 클래스 android.support.design.internal.NavigationMenuItemView의 초기화 중에 발생합니다.

NavigationView과 관련 메뉴가 XML로 정의되었거나 프로그래밍 방식으로 추가 되어도 동일한 예외가 발생합니다. 그래서 나는 무엇이 잘못 되었든간에 새로운 Material 테마와 관련이 있으며 AppCompat 물건을 사용하지 않는다고 확신합니다.

누구도이 문제에 부딪 혔습니까? 이게 효과가 있습니까, 아니면 그냥 바보가되고 있습니까? 제거 거의 모든 사용자 지정과 앱 스타일 :

<style name="AppTheme" parent="android:Theme.Material.Light"> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
    </style> 

activity_main 레이아웃 파일 : 여기

몇 조각이다

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <include layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- comment Nav view out and activity starts fine, with no menu of course --> 
    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

샘플의 주요 활동 코드 :

public class MainActivity extends Activity 
    implements NavigationView.OnNavigationItemSelectedListener { 

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

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    toggle.syncState(); 

    /* uncomment this if XML has its view def removed, same exception results either way 
    NavigationView navigationView = new NavigationView(this); 
    navigationView.setNavigationItemSelectedListener(this); 
    navigationView.setLayoutParams(new DrawerLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START)); 
    navigationView.setFitsSystemWindows(true); 
    navigationView.inflateMenu(R.menu.activity_main_drawer); 
    drawer.addView(navigationView); 
    */ 
} 
... 

내가 디버깅 View.java 코드 및 관련에코드를 사용하여 내부 메뉴 항목 클래스를 작성하는 동안 속성을 처리하지 못한 위치를 확인할 수 있습니다. 버그와 같은 냄새가 나지만, AppCompat 테마와 AppCompatActivity을 사용하지 않으려 고 시도한 것은 이번이 처음입니다. 나는 또한이 테마의 NoActionBar 변형을 사용하고 내 도구 모음을 추가하려고했지만 동일한 오류가 발생하지 않습니다.

아이디어/생각이 있으십니까? 미리 감사드립니다. Lemme 유용한 정보를 생략했는지 알고, 난 초보자입니다

마지막으로 거대한 호출 스택입니다. 근본 원인은 스택에서 세 번째 예외 :

06-10 14:49:53.763 30675-30675/test E/Cause: Binary XML file line #17: Error inflating class android.support.design.internal.NavigationMenuItemView 
android.view.InflateException: Binary XML file line #17: Error inflating class android.support.design.internal.NavigationMenuItemView 
    at android.view.LayoutInflater.createView(LayoutInflater.java:645) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
06-10 14:49:55.023 30675-30675/test E/Cause: null 
java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
06-10 14:49:56.083 30675-30675/test E/Cause: length=522; index=540 
java.lang.ArrayIndexOutOfBoundsException: length=522; index=540 
    at android.content.res.TypedArray.getValueAt(TypedArray.java:1132) 
    at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:661) 
    at android.view.View.<init>(View.java:3964) 
    at android.view.ViewGroup.<init>(ViewGroup.java:573) 
    at android.view.ViewGroup.<init>(ViewGroup.java:569) 
    at android.support.v7.widget.LinearLayoutCompat.<init>(LinearLayoutCompat.java:148) 
    at android.support.design.internal.ForegroundLinearLayout.<init>(ForegroundLinearLayout.java:56) 
    at android.support.design.internal.NavigationMenuItemView.<init>(NavigationMenuItemView.java:64) 
    at android.support.design.internal.NavigationMenuItemView.<init>(NavigationMenuItemView.java:60) 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 

답변

1

당신이 APPCOMPAT 구성 요소 (예 : DrawerLayout 등), 당신은 당신의 기본 테마로 APPCOMPAT 테마를 사용해야하고, 당신의 기지로 AppCompatActivity 것이다 사용하는 경우 활동. 그 이유는 이러한 구성 요소에는 라이브러리 메소드 및 스타일을 지원하는 참조가 많이 있으므로 제외 할 수없는 옵션입니다.

귀하의 앱에 자료가 보이지 않을까 염려한다면, 이러한 지원 라이브러리는 여러 기기에서 앱을 소재로 보도록 설계되었습니다.

+0

정보 주셔서 감사합니다.AppCompat를 필요로하는 지원 기능보다 사용 가능한 기능이 적을 때 appcompat이 아닌 새로운 테마를 소개하는 전략이 무엇인지 궁금합니다. 지원 라이브러리의 하위 호환성 (RecyclerView, DrawerLayout 등)을 명시 적으로 나타내지 않는 부분은 새로운 테마와 함께 사용할 수 있어야합니다. 어쨌든, 미니 허풍의 끝, 도와 줘서 고마워. – SKOlson

1

대부분의 디자인 지원 라이브러리는 NavigationView을 포함하여 AppCompat를 사용해야합니다. 디자인 라이브러리 구성 요소를 사용하려면 AppCompatActivity 및 AppCompat 테마로 다시 전환해야합니다.