Android - как проверить, загружен ли правильный фрагмент? - PullRequest
0 голосов
/ 18 октября 2018

Я недавно начал кодировать свой первый проект Android с использованием Android Studio 3.1.2 и SDK 19.

В настоящее время я пишу тесты для моих объектов без пользовательского интерфейса и хочу проверить, какой фрагмент загружает активностьв методе oncreate().Само действие проверяет инициируемый объект, и в зависимости от флага внутри намерения загружается другой фрагмент.Макет Activity содержит только FrameLayout с именем fragment_container.

SplashActivity:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new LoginFragment()).commit();
        } else {
            if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SplashFragment()).commit();
            }
        }
    }
}

Это фактически весь код SplashActivity на данный момент.Теперь мой вопрос: есть ли способ проверить, какой фрагмент загружен?Возможно getSupportFragmentManager().getFragmentByTag()?Спасибо вперед.

РЕДАКТИРОВАТЬ:

В соответствии с предложенным решением @rxabin я добавил проверку instanceof в мои методы испытаний.

SplashActivityTest:

@RunWith(AndroidJUnit4.class)
public class SplashActivityTest {

    private final SplashActivity testActivity = new SplashActivity();
    private final Intent testIntent = new Intent();

    @Test
    public void canLoadSplashFragment() {
        testActivity.recreate();
        Fragment fragment = testActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        assertTrue(fragment instanceof SplashFragment);
    }

    @Test
    public void canLoadLoginFragment() {
        testIntent.putExtra("isLaunch", false);
        testActivity.recreate();
        Fragment fragment = testActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        assertTrue(fragment instanceof LoginFragment);
    }

}

Когда я пытаюсь запустить этот тест, я получаю RuntimeException: Can't create handler inside thread that has not called Looper.prepare(), ссылаясь на строку, где я определяю testActivity.Любая идея, как мне создать экземпляр действия, чтобы я мог назвать testActivity.recreate() на нем?

1 Ответ

0 голосов
/ 18 октября 2018

Вы должны использовать FragmentManager метод findFragmentById(), затем вы можете проверить, какой это фрагмент, используя instanceof.

Ваш код должен выглядеть примерно так:

mFragmentManager = getSupportFragmentManager();    
Fragment frag = mFragmentManager.findFragmentById(R.id.fragment_container);
if (frag instanceof LoginFragment) {
   // It's a LoginFragment
} else {
    // It's something else!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...