带有碎片的xamarin导航抽屉

时间:2017-07-01 18:13:38

标签: android xamarin

我在这里做错了什么。我想使用导航抽屉,然后为内容创建一些片段,以显示不同的页面'。我有导航视图,汉堡菜单等工作得很好。但我似乎无法让我的碎片出现。所以我尝试用文本视图替换我的片段,这样我就可以判断它是否显示但是我现在甚至无法显示它。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_height="match_parent"
    android:layout_width="fill_parent"
    android:fitsSystemWindows="true">
        <RelativeLayout
                android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <include layout="@layout/toolbar" android:id="@+id/includething"/>
                <TextView
                android:id="@+id/label"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Sample Text "/>
        <!--<FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
                    android:layout_below="@id/includething"/>-->
    </RelativeLayout >

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_height="match_parent"
        android:layout_width="300dp"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header" />
</android.support.v4.widget.DrawerLayout>

编辑:添加工具栏布局我包括

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/MyTheme">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="4dp"
        android:background="?attr/colorPrimary" />
</android.support.design.widget.AppBarLayout>

有一次,我得到了片段,但它出现在导航抽屉里。现在我甚至无法表现出来。我究竟做错了什么?我现在注释掉片段只是希望将textview显示在工具栏下方。如果我可以做到这一点,我相信我可以让碎片的东西工作。

编辑:在尝试板球模式后,我能够更接近,但看起来现在工具栏位于主要内容区域的顶部。有没有办法将其向下移动,以便内容从工具栏的底部开始?我已将片段的背景变为黄色,因此在下图中更容易看到。您可以看到的是,实际上文本出现在片段中但被工具栏阻止了。

enter image description here

3 个答案:

答案 0 :(得分:2)

此代码适用于我的应用程序,在VS2017中使用Xamarin开发。希望它可以帮到你。

您的Main.axml文件应该是这样的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_height="match_parent"
    android:layout_width="fill_parent"
    android:fitsSystemWindows="true">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@color/colorWhite"
        android:id="@+id/ll">
        <include
            layout="@layout/toolbar" />
    </LinearLayout>
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_height="match_parent"
        android:layout_width="320dp"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/navbar" />
</android.support.v4.widget.DrawerLayout>

您的MainActivity

public class MainActivity : AppCompatActivity
{
    #region Menu

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    V7Toolbar toolbar;

    #endregion Menu

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.Main);

        #region Menu

        drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);

        toolbar = FindViewById<V7Toolbar>(Resource.Id.toolbar);
        SetSupportActionBar(toolbar);

        var drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, Resource.String.drawer_open, Resource.String.drawer_close);
        drawerLayout.SetDrawerListener(drawerToggle);
        drawerToggle.SyncState();

        navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
        SetupDrawerContent(navigationView);

        #endregion Menu
    }

    #region Menu

    private void SetupDrawerContent(NavigationView navigationView)
    {
        navigationView.NavigationItemSelected += (sender, e) =>
        {
            e.MenuItem.SetChecked(true);

            FragmentTransaction ft = this.FragmentManager.BeginTransaction();

            switch (e.MenuItem.ItemId)
            {
                case Resource.Id.mn_Home:
                    toolbar.Title = "Dashboard";
                    HomeFragment mg4 = new HomeFragment();
                    ft.Replace(Resource.Id.ll, mg4);
                    break;
            }

            ft.Commit();
            drawerLayout.CloseDrawers();
        };
    }

    public override bool OnCreateOptionsMenu(IMenu menu)
    {
        if (!IsNavigationMenuLoaded)
        {
            navigationView.InflateMenu(Resource.Menu.menu_main);
            IsNavigationMenuLoaded = true;
        }

        return true;
    }

    #endregion Menu
}

你的片段

public class HomeFragment : Fragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = LayoutInflater.From(Activity).Inflate(Resource.Layout.layout_Home, null);
        return view;
    }
}

答案 1 :(得分:1)

从您提供的xml看起来,您的TextView位于工具栏后面。使用RelativeLayout时,所有视图的位置都需要相对于彼此或其父级定义。

如果将shares_memory添加到TextView,将显示文本视图。

android:layout_below="@id/includething"

答案 2 :(得分:1)

  

DrawerLayout充当窗口内容的顶级容器,允许交互式&#34;抽屉&#34;视图从窗口的一个或两个垂直边缘拉出。

你有一个LinearLayout作为顶部元素

您的工具栏也可能正在将文本推出视图。

您可以将解决方案与文档进行比较。 https://developer.android.com/training/implementing-navigation/nav-drawer.html

您的工具栏不仅仅是一个工具栏,它还是一个整体视图。

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

最后一行将你的文字从屏幕上移开