0

私は Android の初心者で、AndroidJUnitテストを使用してコードをテストしています。

だから、私は拡張するテスト活動を持っています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 2番目のものを手に入れたと思います。

4

2 に答える 2

1

最初の試行では、main_layout 内で foo_layout を検索しているため、NullPointerException が発生します。レイアウト内のビューfindViewByIdを検索するために使用され、レイアウトを検索/インフレートするためには使用されません。2 回目の試行では、UI スレッドの外部からUI () にアクセスするため、CalledFromWrongThread 例外が発生します。これは、テスト クラス内でレイアウトを変更する方法です。setContentView()

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);
}
于 2012-04-07T23:04:39.473 に答える
0

よくわかりません...しかし、最初の問題は次のとおりだと思います。

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

への変更:

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

res/layout/ にあなたのUIがあるからですよね?

于 2012-04-07T21:32:22.263 に答える