0

私はXamarin.Formsを使用してクロスプラットフォームアプリケーションを開発しています。私はネイティブXFでサポートされていない勾配、に私のTabLayoutsの背景を設定したいように、私は私のTabbedPagesのカスタムレンダラを書いた:AndroidサブページのFindViewById(Xamarin.Formsを使用)

今たびにトリガしますレンダラを意図したとおりに
using Android.App; 
using Android.Graphics; 
using Android.Support.Design.Widget; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Xamarin.Forms.Platform.Android.AppCompat; 
using MyApp.Droid.Renderer; 

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))] 
namespace MyApp.Droid.Renderer 
{ 
    public class CustomTabbedPageRenderer : TabbedPageRenderer 
    { 
     private Activity _activity; 

     protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) 
     { 
      base.OnElementChanged(e); 

      _activity = this.Context as FormsAppCompatActivity; 
     } 

     protected override void DispatchDraw(Canvas canvas) 
     { 
      base.DispatchDraw(canvas); 

      TabLayout tabs = _activity.FindViewById<TabLayout>(Resource.Id.sliding_tabs); 

      var gradient = new MyGradient(); 

      tabs.SetBackground(gradient); 
     } 
    } 
} 

アプリはTabbedPageを読み込みます。 しかし、_activity.FindViewById<TabLayout>(Resource.Id.sliding_tabs)は常にMainPageのTabLayoutを返します(またMyGradientを背景として適切に設定しています)。私のサブページの1つでTabLayoutを取得する方法もわかりません。

これはXamarinやAndroidに問題があるかどうかわからない...

は、あなたたちは私を助けることができる願っています。

ありがとうございます!

EDIT:ここのstyles.xmlは(私はそれがコード-見習いが言及された@何を望む)です。また

<resources> 
    <style name="MainTheme" parent="MainTheme.Base"> 
    </style> 
    <!-- Base theme applied no matter what API --> 
    <style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!--If you are using revision 22.1 please use just windowNoTitle. Without android:--> 
    <item name="windowNoTitle">true</item> 
    <!--We will be using the toolbar so no need to show ActionBar--> 
    <item name="windowActionBar">false</item> 
    <!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette --> 
    <!-- colorPrimary is used for the default action bar background --> 
    <item name="colorPrimary">#2196F3</item> 
    <!-- colorPrimaryDark is used for the status bar --> 
    <!--<item name="colorPrimaryDark">#1976D2</item>--> 
    <item name="colorPrimaryDark">#FF8630</item> 
    <!--<item name="android:windowTranslucentStatus">true</item>--> 
    <!-- colorAccent is used as the default value for colorControlActivated 
    which is used to tint widgets --> 
    <item name="colorAccent">#FF4081</item> 
    <!-- You can also set colorControlNormal, colorControlActivated 
    colorControlHighlight and colorSwitchThumbNormal. --> 
    <item name="windowActionModeOverlay">true</item> 

    <item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item> 
    </style> 

    <style name="AppCompatDialogStyle" parent="Theme.AppCompat.Light.Dialog"> 
    <item name="colorAccent">#FF4081</item> 
    </style> 
</resources> 

メインページのトップのスクリーンショット:http://i.imgur.com/VyX3YX7.png

それはサブページです(MainPage.Navigation.PushAsync(new SubPage());):http://i.imgur.com/pRmecjE.png

+1

適切なXMLレイアウトファイルを表示してください。また、いくつかのスクリーンショットを表示できますか? –

+0

私の質問に変更が追加されました – japhwil

+0

私はかなり理解していません、サブページのレイアウトはPCLで定義する必要がありますか?レンダラーでそれを探したいのはなぜですか? –

答えて

0

は、ここで私は(私はそれがこれを行うための最もエレガントな方法ではないと思うが)今欲しい私は結果を得る方法は次のとおりです。

using Android.Runtime; 
using Android.Support.Design.Widget; 
using Android.Views; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Xamarin.Forms.Platform.Android.AppCompat; 
using MyApp.Droid.Renderer; 

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))] 
namespace MyApp.Droid.Renderer 
{ 
    public class CustomTabbedPageRenderer : TabbedPageRenderer 
    { 
     protected override void OnVisibilityChanged(Android.Views.View changedView, [GeneratedEnum] ViewStates visibility) 
     { 
      base.OnVisibilityChanged(changedView, visibility); 

      if (visibility == ViewStates.Visible) 
      { 
       var tabs = changedView.FindViewById<TabLayout>(Resource.Id.sliding_tabs); 
       var gradient = new MyGradient(); 
       tabs.SetBackground(gradient); 
      } 
     } 
    } 
} 
0

私のApp内のTabbedPagesはレンダラーを介してうまくいくだけですが、必要なのはTabLayout(タブがAndroid上にあるタブ)です。

質問を正しく理解したら、各サブページのタブレイアウトをTabbedPageにカスタマイズする必要があります。

SetTabIconメソッドをオーバーライドする必要があります。例えば:あなたはまた、このquestionに私の答えを確認することができます

[assembly: ExportRenderer(typeof(MyTabbedPage), typeof(MyTabbedPageRenderer))] 

namespace YourNameSpace.Droid 
{ 
    public class MyTabbedPageRenderer : TabbedPageRenderer 
    { 
     protected override void SetTabIcon(TabLayout.Tab tab, FileImageSource icon) 
     { 
      base.SetTabIcon(tab, icon); 

      //set your custom layout for tab. The layout resource "mytablayout" is placed in the layout folder of android project. 
      tab.SetCustomView(Resource.Layout.mytablayout);   
     } 
    } 
} 

は、そこに私は、一致するサブページを削除するには、タブでButtonを置きました。不思議誰のために

+0

答えをありがとう!しかし、これは私のためには機能しません。 1つは、別々のタブの背景にのみ影響するため、その間には隙間があります。何らかの理由で、メソッドは2番目のTabbedPageで呼び出されることさえありません。 – japhwil

関連する問題