c# - 使用片段嵌套选项卡移动选项卡
问题描述
我是 android 新手,尤其是 Xamarin Android C#。我有底部导航标签和片段。它们是fragment_picture(tab_picture)、fragment home(tab_home)、fragment通知(tab_notifications)、fragment_profile(tab_profile)。在 fragment_picture (tab_picture) 里面,我有 2 个标签。它们是 fragment_camera(tab_camera) 和 fragment_gallery(tab_gallery)。我想移动 fragment_picture 的选项卡,例如当我单击 tab_camera 时,它显示 tab_camera 的 XML,当我单击 tab_gallery 时,它显示 tab_gallery 的 XML。
我不使用viewpager。我只是使用片段。该选项卡不会将位置更改为其 XML。我在谷歌搜索了很多但是,我仍然感到困惑。请帮我
using System;
using Android.OS;
using Android.Support.Design.Widget;
using Android.Views;
using Android.Support.V4.App;
using Android.Widget;
namespace MyPhotographicMemory.Droid.Fragments
{
public class Fragment_Picture : Fragment
{
TabLayout tabLayout;
private TabLayout.Tab tabGallery, tabCamera;
Fragment fragment = null;
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public static Fragment_Picture NewInstance()
{
var frag2 = new Fragment_Picture { Arguments = new Bundle() };
return frag2;
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var v = inflater.Inflate(Resource.Layout.FragmentPicture, null);
tabLayout = v.FindViewById<TabLayout>(Resource.Id.pictureTabLayout);
tabLayout.TabSelected += (object sender, TabLayout.TabSelectedEventArgs e) =>
{
switch (e.Tab.Position)
{
case Resource.Layout.FragmentCamera: //Resource.Id.tabItem1
fragment = new Fragment_Camera();
TabLayout.Tab tab = tabLayout.GetTabAt(0);
tab.Select();
break;
case Resource.Layout.FragmentGallery: //Resource.Id.tabItem1
fragment = new Fragment_Gallery();
TabLayout.Tab tab1 = tabLayout.GetTabAt(1);
tab1.Select();
break;
}
};
return v;
}
}
}
解决方案
你想达到这样的GIF效果吗?
如果是这样,您应该使用片段实现嵌套选项卡。
这是我在第一个片段中的代码。
public class Fragment1 : Fragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
}
public static Fragment1 NewInstance()
{
var frag1 = new Fragment1 { Arguments = new Bundle() };
return frag1;
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var view = inflater.Inflate(Resource.Layout.fragment1, null);
BottomNavigationView bottomNavigationView= view.FindViewById<BottomNavigationView>(Resource.Id.mynested_bottom_navi);
bottomNavigationView.NavigationItemSelected += BottomNavigationView_NavigationItemSelected;
LoadFragment(Resource.Id.tab_camera);
return view;
}
private void BottomNavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
LoadFragment(e.Item.ItemId);
}
//switch fragment by tab id.
void LoadFragment(int id)
{
Fragment fragment = null;
switch (id)
{
case Resource.Id.tab_gallery:
fragment = Fragment_Gallery.NewInstance();
break;
case Resource.Id.tab_camera:
fragment = Fragment_Camera.NewInstance();
break;
}
if (fragment == null)
return;
FragmentManager.BeginTransaction()
.Replace(Resource.Id.mynest_content_frame, fragment)
.Commit();
}
}
这是我的demo,大家可以参考。 https://drive.google.com/file/d/1XZE6YopdsvDHY8-DwXBxRpHz3oFlJbOR/view
推荐阅读
- sql - SQL; 在 hive/hue 中使用 sql 拆分一个值
- android - 如何在 Jetpack Compose Navigation 中正确使用 Viewmodel
- node.js - React Native 不支持动态需求
- python - scipy.optimize:使用列表与 ndarrays
- javascript - onclick 事件不是函数
- java - Java应用程序不在docker容器内应用环境变量
- mapbox - Mapbox gl js插入标记文本偏移间距
- php - 如何将 * 作为参数传递给 jQuery 以在 Laravel 控制器中进行验证?
- r - 如何获取上级目录中的文件?
- c# - 如何从 ListBox 播放 wav 文件?