안드로이드 프로젝트에서 플랫폼 특정 렌더러를 작성하여 Xamarin Forms 크로스 플랫폼 앱에서 iOS와 유사한 탭 페이지를 만들기 위해 andoid의 BottomNavigationView
을 사용하려고합니다. 기본적으로 나는 bottomnavigationview가있는 레이아웃을 추가하고 렌더러에서이 뷰를 루트 액티비티에 추가하고 폼 탭 페이지를 기반으로 메뉴 항목을 만듭니다. 이제 문제는 폼 탭 페이지의 현재 페이지를 안드로이드 레이아웃에 추가/표시하고 막대 항목을 클릭 할 때 어떻게 바꿀 수 있습니까? 렌더러에 RemoveAllViews
라고 부르는 것을 발견했습니다. 탭 페이지의 컨텐츠 페이지가 전체 화면을 차지하게되고 하단 바를 덮어 버릴 것입니다. 따라서 탭이 지정된 페이지 중 하나의 내용 페이지가 표시되면 전체 화면을 차지합니다. 또한 안드로이드의 AddView
메소드는 안드로이드 뷰만 허용하고 폼 뷰는 허용하지 않습니다.안드로이드 레이아웃보기에서 페이지를 추가하거나 교체하는 방법
BottomNav 레이아웃 :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent">
<FrameLayout
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:layout_above="@+id/bottom_navigation"
android:orientation="vertical">
</FrameLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
android:background="@color/colorPrimary"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/bottom_navigation_main" />
</RelativeLayout>
렌더러 OnElementChanged :
base.OnElementChanged(e);
TabbedPage oe = e.OldElement;
TabbedPage ne = e.NewElement;
int id = 1000;
foreach(Page p in ne.Children)
{
items.Add(new Item
{
text = p.Title,
icon = p.Icon,
page = p,
id = id++,
});
p.IsVisible = false; // without this, page show full screen and covers the bottom bar
}
RemoveAllViews();
Activity activity = this.Context as Activity;
view = activity.LayoutInflater.Inflate(Resource.Layout.BottomNav, this, false);
AddView(view);
layout = view.FindViewById<FrameLayout>(Resource.Id.rootLayout);
// add current page to layout, or replace layout with page? and How?
//
//
BottomNavigationView bottomNavigationView = (BottomNavigationView)
FindViewById(Resource.Id.bottom_navigation);
bottomNavigationView.NavigationItemSelected += BottomNavigationView_NavigationItemSelected;
Android.Support.V7.View.Menu.MenuBuilder menu = bottomNavigationView.Menu as Android.Support.V7.View.Menu.MenuBuilder;
menu.Clear();
foreach(Item i in items)
{
IMenuItem mi = menu.Add(0, i.id, 0, i.text);
mi.SetIcon(Resource.Drawable.icon);
}
편집 : 더 많은 코드 및 스크린 샷을 추가
내에서 예상되는 레이아웃은 XF에서 페이지를 표시하지 않고, 이런 식입니다 tabbedpage, 빨간색의 주요 부분은 rootLayout
의 FrameLayout
이며 목표는 tabbedpage의 현재 페이지를 t에 추가하는 것입니다. 그는 Framelayout을 표시하고 BottomNavigationView의 항목을 클릭하면 FrameLayout을 전환하여 다른 페이지를 표시합니다. 하지만이 화면에서 보이지 않는 모든 페이지를함으로써 만 가능합니다 :
foreach (Page p in e.NewElement.Children)
{
p.IsVisible = false;
}
false로 설정 보이지 않고, 서브 페이지가 전체 화면을 차지합니다 경우
내 테스트 XF를 탭 페이지 :
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:BottomTabbed"
x:Class="BottomTabbed.TabbedPage1"
NavigationPage.HasNavigationBar="False">
<ContentPage Title="Tab 1" BackgroundColor="Green" />
<ContentPage Title="Tab 2" BackgroundColor="Blue"/>
<ContentPage Title="Tab 3" BackgroundColor="Red"/>
<ContentPage Title="Tab 4" BackgroundColor="Gray" />
</TabbedPage>
하나는 https를 구현하는 방법을 보려면 다음 구성 요소를 사용하거나 코드를 보면 /github.com/thrive-now/BottomNavigationBarXF –
나는 그것을 조사했다, 그것은 안드로이드 bottomnavigationview를 사용하고 있지 않다, 그것에서 relativelayout와 버튼을 사용하고있다. – fluter
사용자 정의하려는 렌더러는 무엇입니까? 이후 사용자 정의 렌더러의 모든 코드를 보지 못했지만'TabbedPageRenderer'를 시도하고있는 것처럼 보입니까? –