2012-04-07 4 views
0

저는 Android의 초보자이며 Android JUnit 테스트를 사용하여 코드를 테스트하고 있습니다.XML의 onClick 속성과 연결된 활동에서 레이아웃을 얻는 방법은 무엇입니까?

따라서 테스트 활동은 ActivityInstrumentationTestCase2<Activity>입니다.

활동에는 onCreate() 방법의 자체 레이아웃이 있습니다. (기본 레이아웃)

내 XML에는 메서드를 호출하는 버튼에 onClick 속성이 있습니다.

활동으로 돌아 가기 foo(View v)에서 내 콘텐츠보기를 다른 레이아웃으로 설정했습니다.

레이아웃을 테스트하고 싶습니다.

레이아웃을 어떻게 얻습니까?

기본 레이아웃은 알고 있습니다.

Activity act = getActivity(); 
View mainLayout = (View) act.findViewById(bla.bla.bla.R.id.main_layout); 

foo(View v)에서 설정 한 레이아웃은 어떻게 받습니까 ??

이미 일을 시도했습니다

,

fooLayout = (View) act.findViewById(bla.bla.bla.R.id.foo_layout); 

act.setContentView(bla.bla.bla.R.layout.foo_layout); 
fooLayout = (View) act.findViewById(bla.bla.bla.R.id.foo_layout); 

가 나는 두 번째의 첫 번째 및 android.view.ViewRootImpl$CalledFromWrongThreadException 에 대한 NullPointerException 거 같아요.

답변

0

난 잘 모르겠어요 ...하지만 난 첫 번째 문제는 생각 :

act.setContentView(bla.bla.bla.R.id.foo_layout); 

변화 :

act.setContentView(bla.bla.bla.R.layout.foo_layout); 

때문에 입술에/레이아웃/당신이 당신의 UI를 가지고, ISN ' 그렇지?

+0

죄송합니다. 오타였습니다. 나는 나중에 것을 의미했다. – Rufus

1

main_layout에서 foo_layout을 검색 중이므로 처음 시도 할 때 NullPointerException이 발생합니다. findViewById보기를 검색하는 데 사용되며은 레이아웃이 아니며 레이아웃을 찾거나 팽창시키지 않습니다. UI 스레드 외부에서 UI (setContentView())에 액세스하기 때문에 두 번째 시도에서 CalledFromWrongThread 예외가 발생합니다.

getActivity().runOnUiThread(new Runnable() { 
@Override 
    public void run() { 
     getActivity().setContentView(R.layout.foo_layout); 
    } 
}); 
getInstrumentation().waitForIdleSync(); 
// now you can access your views from your foo_layout via getActivity().findViewById(...) 

난 당신이 "나는 내 레이아웃을 테스트 할"무슨 뜻인지 모르는 : 이것은 당신의 테스트 클래스 고급형 아파트 레이아웃을 변경하는 방법입니다. 레이아웃이 버튼 클릭을 통해 성공적으로로드되었는지 또는 새 (로드 된) 레이아웃의보기에 액세스할지 확인하려는 경우. 두 경우 모두 다음과 같이 할 수 있습니다.

public void testLayout() { 
    // get your button that changes the layout of your activity. 
    // that button is in your main_layout 
    final Button btChangeLayout = (Button) getActivity().findViewById(R.id.yourButtonThatChangesTheLayout); 

    // perform a click in order to change the layout 
    getActivity().runOnUiThread(new Runnable() { 
    @Override 
     public void run() { 
      btChangeLayout.performClick(); 
     } 
    }); 
    getInstrumentation().waitForIdleSync(); 

    // get a reference of a view thats in your foo_layout e.g. a Button 
    Button aButtonInYourFooLayout = (Button) getActivity().findViewById(R.id.aButtonInYourFooLayout); 
    // now you can do what your want with your button/view. 

    //if you just want to know wheter your layout has successfully been loaded 
    //or not you can test your view if it's null 
    assertNotNull(aButtonInYourFooLayout); 
} 
+0

이제 내가 잘못한 것을 이해합니다. 이제 작동합니다. 고마워요 !!! – Rufus

+0

당신을 진심으로 환영합니다. 대답을 잊지 마라. – 207

관련 문제