2013-07-16 19 views
19

Tôi đang cố gắng thêm DrawerLayout vào ứng dụng của mình để điều hướng và tôi đang thử nghiệm ứng dụng của mình với Robolectric (Tôi đã thấy vấn đề này cả với Robolectric 2.1.1 và 2.1-SNAPSHOT - 2.2-20130712.161723-17)Trong Robolectric, làm cách nào để nhận được khoảng DrawerLayout phải được đo bằng lỗi MeasureSpec.EXACTLY?

Tôi đang sử dụng xml sau cho cơ sở bố cục ngăn kéo của mình. Tôi gặp phải lỗi trong Robolectric khi tôi có andioid: layout_width hoặc android: layout_height được đặt là "match_parent" trên Bố cục ngăn kéo.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
    <!-- The navigation drawer --> 
    <ListView android:id="@+id/left_drawer" 
     android:layout_width="250dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="#D8D8D8" 
     android:dividerHeight="1dp" 
     android:background="#F2F2F2"/> 
</android.support.v4.widget.DrawerLayout> 

Dưới đây là stack trace của lỗi Tôi đang gặp phải:

java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY. 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:591) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4816) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
    at android.view.Choreographer.doFrame(Choreographer.java:525) 
    at android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:657) 
    at org.robolectric.shadows.ShadowHandler.routeMessage(ShadowHandler.java:125) 
    at org.robolectric.shadows.ShadowHandler.access$100(ShadowHandler.java:25) 
    at org.robolectric.shadows.ShadowHandler$1.run(ShadowHandler.java:110) 
    at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162) 
    at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107) 
    at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92) 
    at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68) 
    at org.robolectric.util.Scheduler.unPause(Scheduler.java:25) 
    at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:219) 
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:258) 
    at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:32) 
    at android.view.ViewGroup.addView(ViewGroup.java) 
    at android.view.ViewGroup.addView(ViewGroup.java:3225) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:497) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
    at org.robolectric.tester.android.view.RoboWindow.setContentView(RoboWindow.java:82) 
    at org.robolectric.shadows.ShadowActivity.setContentView(ShadowActivity.java:273) 
    at android.app.Activity.setContentView(Activity.java) 
    at com.taskrabbit.droidrabbitstaging.TRRootDrawerActivity.onCreate(TRRootDrawerActivity.java:35) 
    at com.taskrabbit.droidrabbitstaging.ui.routes.EmptyRouteActivity.onCreate(EmptyRouteActivity.java:34) 
    at com.taskrabbit.droidrabbitstaging.ui.routes.EmptyRouteActivityTest.setUp(EmptyRouteActivityTest.java:62) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:241) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Tôi đã cố gắng thiết lập những đến một giá trị mã hóa cứng (của nói 400dp) và xóa lên những vấn đề trong các bài kiểm tra. Tuy nhiên, sau đó tôi gặp sự cố khi nhận chiều rộng & chiều cao được match_parent cho ứng dụng của tôi được cài đặt trên điện thoại của tôi. Có cách nào để tôi có thể thiết lập chiều rộng và chiều cao của thiết bị Robolectric của tôi không? Hoặc có ai gặp phải điều này và đưa ra một số công việc khác xung quanh?

Dường như có liên quan đến vấn đề này: https://code.google.com/p/android/issues/detail?id=55611 Lưu ý, tác dụng phụ khác của vấn đề này là Chế độ xem thiết kế bị hỏng.

+0

điều gì sẽ xảy ra nếu bạn mở rộng DrawerLayouout và đảm bảo rằng MesureSpec bị buộc phải chính xác ... nếu sẽ thử điều đó, vì tôi đã chạy cùng một vấn đề – joecks

Trả lời

30

Sau một số lần đào, tôi đã tìm được giải pháp. Có vẻ như Robolectric bằng cách nào đó đang bỏ lỡ các MeasureSpecs, dẫn đến vấn đề này. Trong trường hợp của tôi, tôi có thể khắc phục vấn đề này bằng cách mở rộng DrawerLayout, và trọng onMeasure():

public class CustomDrawerLayout extends DrawerLayout { 

    public CustomDrawerLayout(Context context) { 
     super(context); 
    } 

    public CustomDrawerLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     widthMeasureSpec = MeasureSpec.makeMeasureSpec(
       MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY); 
     heightMeasureSpec = MeasureSpec.makeMeasureSpec(
       MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

} 
+3

Tôi vừa tìm được câu trả lời của bạn ... ý định từ một mảnh mà là một phần của một chế độ xem drawerlayout ... lái xe cho tôi hạt .. Cảm ơn bạn rất nhiều! –

+0

Điều này vẫn còn là một vấn đề trong vấn đề thời gian chạy, mặc dù Google tuyên bố đã sửa lỗi này trong bản sửa đổi Thư viện hỗ trợ Android 19 (tháng 10 năm 2013). Hack này hoạt động tốt hơn nhiều so với hack trước đây của tôi. – DataGraham

0

Chỉ cần chạy chương trình của bạn trên thiết bị Android của bạn. Nó chạy hoàn hảo. Chỉ cần một số vấn đề trong Eclipse tôi đoán.

Các vấn đề liên quan