在基本导航抽屉模板中更改content_main XML

时间:2018-12-11 01:09:20

标签: android android-studio

我真的是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,但我认为我应该只更改app_bar_main.xml中包含的content_main.xml。我该如何强调呢?

当我执行裘德的建议时,我得到了更新的结果。片段在正确的位置,但是仍然以某种方式显示content_main_frame.xml(hello world)。

result for now

3 个答案:

答案 0 :(得分:1)

也许您应该尝试在INSERT INTO table2 (SEQ_ID, REQ_ID,call_id,summary,count) SELECT min(seq_id) seq_id , req_id , call_id , S1_vs_S2 ,((SELECT sum(c2) FROM TABLE_STG_CTRL WHERE source='S1')- SELECT sum(c2) FROM TABLE_STG_CTRL WHERE source='S2')) FROM table1 GROUP BY req_ID, Ctrl_ID, c1, source ORDER BY SEQ_ID ; xml文件中创建一个framelayout。 然后将新片段加载到framelayout中。这就像为新片段创建框架一样。 然后像这样加载它:

content_main

答案 1 :(得分:0)

您可以执行以下操作:

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());

答案 2 :(得分:0)

在与Mike.M的讨论中,我能够解决我的问题,而他提供了方法。为了使该线程可关闭,我想在此发布解决方案,引用Mike.M:

如果要用FragmentTransaction替换某些视图,则这些视图应该位于自己的Fragment中,您可以在启动时将其加载到Activity的onCreate()中。只要您为所有这些传递相同的R.id,您随后的replace()事务将按预期工作。也就是说,前提是您要将它们交换出同一ViewGroup。 (顺便说一句,如果您想ping我,请在我的用户名前面加上@。如果有多个其他用户在评论中,除非您直接将其发送给用户,否则我们不会收到通知。)

这将产生以下分步解决方案:

  1. 我必须进行空白的Framelayout,例如使我的content_main.xml为空。
  2. 为初始内容制作一个单独的片段,并在开始时将其加载到content_main.xml中。
  3. 打开新抽屉后,我创建了一个片段容器,它是我的Framelayout,带有一个新片段。