как сохранить заголовок, не меняя его, когда ориентация происходит с заголовком по умолчанию android - PullRequest
0 голосов
/ 26 марта 2020

У созданного действия есть несколько фрагментов, которые открываются, если щелкнуть пункты меню в ящике навигации. Проблема, с которой я сталкиваюсь, заключается в том, что когда я выбираю какой-либо элемент, и открывается соответствующий фрагмент с правильным заголовком на панели инструментов, а затем поворачивается приложение, фрагмент которого остается (что я хочу и что я сделал, я использовал saveInstanceState, чтобы сохранить его) заголовок на панели инструментов меняется на заголовок по умолчанию!

Я не знал, как сохранить заголовок с фрагментами

здесь - активность

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener  {

TextView header;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    header = findViewById(R.id.header);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    setupDrawer(toolbar);

    if(savedInstanceState==null) {
        HomeFragment fragment = new HomeFragment();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.content, fragment);
        fragmentTransaction.commit();

        header.setText("Home");
    }

    ActionBar ab = getSupportActionBar();
    if (ab != null) {
        ab.setTitle(null);
        ab.setHomeButtonEnabled(true);
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeAsUpIndicator(R.drawable.ic_launcher_foreground);
    }

}

private void setupDrawer(Toolbar toolbar) {

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();


    Fragment fragment = null;

    switch (id) {
        case R.id.nav_home:
            fragment = new HomeFragment();
            header.setText("Home");
            break;
        case R.id.nav_settings:
            fragment = new SettingsFragment();
            header.setText("Settings");
            break;
        case R.id.nav_about:
            fragment = new AboutFragment();
            header.setText("About app");
            break;

    }


    if (fragment != null) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.content, fragment);
        fragmentTransaction.commit();
    }

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


}

, а здесь xml для активности

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"
tools:context=".MainActivity">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white">

        <include layout="@layout/toolbar"/>


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/content"

            />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:itemTextColor="@color/colorPrimary"
        app:itemIconTint="@color/colorPrimary"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/navigation_drawer">


    </com.google.android.material.navigation.NavigationView>

</androidx.drawerlayout.widget.DrawerLayout>

моя панель инструментов xml:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.AppBarLayout
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"
app:elevation="0dp">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@android:color/holo_red_dark">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:lineSpacingExtra="28sp"
            android:text="Home"
            android:textAllCaps="true"
            android:textColor="@android:color/black"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </LinearLayout>

</androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.AppBarLayout>

Я искал и нашел некоторые решения, но у меня не получилось или, может быть, я не знал, как это сделать правильно, поэтому, пожалуйста, помогите, заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Я нашел решение, на самом деле я пробовал это раньше, но я делал что-то не так, теперь я начинаю делать то, что сделал .. Решение, которое я нахожу, заключается в использовании следующего кода:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putString(STATE_SELECTED_KEY, title);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    title = savedInstanceState.getString(STATE_SELECTED_KEY, "Home");
    header.setText(title);
}

значение заголовок переменной изменяется в выбранном пункте меню, а затем мы просто сохраняем его в onSaveInstanceState (Bundle outState) и вызываем onRestoreInstanceState (Bundle saveInstanceState), чтобы получить его обратно

благодаря этому решению , которое я нашел здесь

0 голосов
/ 26 марта 2020

1- Попробуйте объявить saveEnabled = "true" в тексте внутри макета xml.

2- попробуйте это:

header = findViewById(R.id.header);

    if (myNewBoolean) {
        tvNowUsedFiltres.setVisibility(View.VISIBLE);
    }

3- попробуйте это тоже:

поместите это в свой фрагмент onCreate ()

setRetainInstance(boolean)
...