Изменить XML-файл content_main в базовом шаблоне ящика навигации - PullRequest
0 голосов
/ 11 декабря 2018

Я действительно новичок в Android Studio и борюсь с очень простой проблемой.Я видел несколько потоков по этой проблеме, но ни одна из них точно не решает мою проблему.

Проблема: Как я могу изменить фрагмент в шаблоне NavigationDrawer?Шаблон предоставляет среду, в которой так называемый content_main.xml должен быть заменен другим фрагментом.Я не знаю, как это сделать

Что я пытался: Поскольку я не смог изменить content_main.xml, я изменил весь xml, включая content_main.xml.Это проще понять, если вы просто посмотрите на мой код.

Шаблон app_bar_main.xml , который задает, как должны выглядеть фрагменты, и включает content_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    android:id="@+id/content_main_frame"
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:showIn="@layout/app_bar_main"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</FrameLayout>

В ящике навигации main_activity я изменяю свой фрагмент следующим образом:

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        Fragment newFragment;
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        if (id == ..) {
        } else if (id == R.id.nav_emergencies) {
            transaction.replace(R.id.content_main_frame, new Drawer_Emergencies());
        transaction.addToBackStack(null);
        transaction.commit();

}}

Как вы можете видеть, транзакция заменяет весь app_bar_main, но я думаю, что долженпросто измените content_main.xml, который включен в app_bar_main.xml.Как мне это сделать?

Когда я реализовал предложение от Иуды, я получил обновленный результат.Фрагмент находится в нужном месте, но каким-то образом content_main_frame.xml (привет мир) все еще отображается.

result for now

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

возможно, вам следует попытаться создать framelayout внутри вашего content_main xml файла.затем загрузите новый фрагмент в framelayout. Это похоже на создание кадра для нового фрагмента.затем загрузите его как:

transaction.add(R.id.yourframelayoutid, new Drawer_Emergencies()).commit();
0 голосов
/ 13 декабря 2018

Из обсуждения с Mike.MI удалось решить мою проблему, тогда как он предоставил способ.Чтобы сделать этот поток закрытым, я хочу опубликовать решение здесь со ссылкой на Mike.M:

Если вы хотите заменить некоторые представления на FragmentTransaction, эти представления должны быть в своем собственном фрагменте, которыйВы можете загрузить при запуске, в onCreate ().Ваши последующие транзакции replace () будут работать, как и ожидалось, при условии, что вы передаете одинаковый R.id для всех них;т.е. при условии, что вы меняете их из одной и той же ViewGroup.(Кстати, пожалуйста, поставьте @ перед моим именем пользователя, когда вы хотите пропинговать меня. Когда в комментариях присутствует более одного пользователя, мы не получим уведомление, если вы не отправите его непосредственно пользователю.)

Что дает следующее пошаговое решение:

  1. Я должен сделать пустое Framelayout, например, сделать мой content_main.xml пустым.
  2. Создайте отдельный фрагмент для начального содержимого и загрузите его в content_main.xml в начале.
  3. После открытия нового ящика я создаю контейнер фрагментов, который является моим Framelayout с новым фрагментом..
0 голосов
/ 11 декабря 2018

Вы можете сделать что-то вроде этого:

content_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:id="@+id/content_frame">

</FrameLayout>

и затем

        transaction.replace(R.id.content_frame, new Drawer_Emergencies());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...