2012-04-07 49 views
0

我是Android的初學者,我使用Android JUnit測試測試我的代碼。如何從與XML中的onClick屬性鏈接的活動獲取佈局?

所以,我有一個測試活動,延伸ActivityInstrumentationTestCase2<Activity>

活動在onCreate()方法中有它自己的佈局。 (主版面)

在我的XML中,我有一個onClick屬性,用於調用foo()方法的按鈕。

返回活動,在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); 

我覺得我得到了NullPointerException爲第二個的第一個和android.view.ViewRootImpl$CalledFromWrongThreadException

回答

0

我不知道...但我想到的第一個問題是:

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

變化:

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

因爲在res /佈局/你有你的UI,ISN」它呢?

+0

對不起,這是一個錯字。我的意思是後面的一個。 – Rufus 2012-04-07 21:56:14

1

在您的第一次嘗試中,您將得到一個NullPointerException,因爲您正在搜索您的main_layout中的foo_layout。 findViewById用於搜索意見用於佈局而不是查找/膨脹佈局。在第二次嘗試中,您會遇到CalledFromWrongThreadException,因爲您從UI線程外部訪問UI(setContentView())。這是你如何更改佈局wihtin您的測試類:

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 2012-04-09 04:47:43

+0

不客氣。不要忘記接受答案 – 207 2012-04-09 07:53:12