У меня есть FrameLayout в макете заголовка меню ящика.И я хочу изменить элемент в этом FrameLayout в зависимости от того, авторизован он пользователем или нет.
У меня есть основной класс.Часть кода:
Ссылка на GitHub введите описание ссылки здесь
@Override
protected void onCreate(Bundle savedInstanceState) {
changeTheme();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProgramsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_programs);
}
contextOfApplication = getApplicationContext();
changeLoginStatus();
}
public void changeLoginStatus() {
Fragment fragment = null;
if (FirebaseAuth.getInstance().getCurrentUser() != null) {
fragment = new NavHeaderAuthorized();
} else fragment = new NavHeaderNotAuthorized();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fr_nav_header, fragment).commit(); //the problem is here
}`
И если я вызываю функцию changeLoginStatus () в методе onCreate, я вижу ошибку (еслиЯ вызываю функцию в других методах, все в порядке):
java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.example.oleg.slidemenu / com.android.fitapp.Main}: javaИсключениена android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2933) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1612) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6710) наjava.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java): 770) Причина: java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x7f09007a (com.example.oleg.slidemenu: id / fr_nav_header) для фрагмента NavHeaderNotAuthorized {c970472 # 1 id = 0x7f09007a} * 101 * 101 * 101
1013* Я знаю причину: значение R.id.fr_nav_header берет из MainActivity и возвращает ноль, потому что этот элемент находится в nav_header.xml.
nav_header.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:gravity="bottom"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingTop="25dp"
android:paddingEnd="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="cursive"
android:text="FitApp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?attr/textColor"
android:textSize="25dp" />
<FrameLayout
android:id="@+id/fr_nav_header"
android:name="layout.NavHeaderNotAuthorized"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</FrameLayout>
</LinearLayout>