簡體   English   中英

Xamarin.forms 不顯示來自 Xamarin.Android 的 ViewRenderer 的內容

[英]Xamarin.forms doesn't show the content of ViewRenderer from Xamarin.Android

在我的項目中,我研究了 Xamarin.forms 和 Xamarin.android。 Xamarin.forms 中的所有頁面都可以正常工作,但是當我單擊應該指向 Xamarin.forms 中的活動的按鈕時,它什么也沒有顯示。 我的代碼如下所示,我想在Xamarin.Forms中顯示 NewViewRenderer 中的內容

** Xamarin.forms:

MainPage.xaml(它有顯示 RegionPage.xaml 的波紋管按鈕)

...
            <StackLayout Grid.Row="2" Grid.Column="1" Orientation="Vertical">
                <Image Source="location.png"  
                   Grid.Row="2"  
                   Grid.Column="1"  
                   BackgroundColor="White"  
                   WidthRequest="60" HeightRequest="60" 
                   >
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped_5"/>
                </Image.GestureRecognizers>
            </Image>
                <Label Text="Regions" HorizontalTextAlignment="Center" />
            </StackLayout>
....

新視圖.cs

    using ...
    namespace miemss_xamarin
    {public class NewView : View{}}

RegionPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:miemss_xamarin;assembly=miemss_xamarin"
             mc:Ignorable="d"
             Title="Regions"
             x:Class="miemss_xamarin.RegionPage">
    <ContentPage.Content>

        <local:NewView />
    </ContentPage.Content>
</ContentPage>

在 android 中,我的布局(NotificationLayout.xml)是這樣的:

<?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">


    <TextView
        android:text="Message Notifications for:"
        android:id="@+id/msgText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMediumInverse"
        android:padding="10dp"
        android:textColor="@android:color/black"
        />
    <Switch
        android:id="@+id/SubscribeToRegion1"
        android:text="Region 1"
        android:textAppearance="?android:attr/textAppearanceMediumInverse"
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> ... (and 4 other Switches)

新視圖渲染器.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Firebase.Messaging;
using miemss_xamarin.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(miemss_xamarin.NewView), typeof(NewViewRenderer))]

namespace miemss_xamarin.Droid
{
   public class NewViewRenderer : ViewRenderer <miemss_xamarin.NewView,miemss_xamarin.Droid.NewViewRenderer>
    {
        NewViewRenderer newViewRenderer;
        Android.Widget.Switch btnRegion1; Android.Widget.Switch btnRegion2; Android.Widget.Switch btnRegion3; Android.Widget.Switch btnRegion4; Android.Widget.Switch btnRegion5;
       public NewViewRenderer (Context context):base (context)
        {

        }
        protected override void OnElementChanged(ElementChangedEventArgs<miemss_xamarin.NewView> e)
        {
            base.OnElementChanged(e);
            if (Control == null)
            {
              //  var context = new NewViewRenderer(Forms.Context);
                //SetNativeControl(context);
                var context = Android.App.Application.Context;

                LayoutInflater minflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;
                var view = minflater.Inflate(Resource.Layout.NotificationLayout, this, false);
                var msgText = view.FindViewById<TextView>(Resource.Id.msgText);
                 btnRegion1 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion1);
                 btnRegion2 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion2);
                 btnRegion3 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion3);
                 btnRegion4 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion4);
                 btnRegion5 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion5);


            //   base.SetNativeControl(view);
It always shows red underline under view, so I
            }



            if (e.NewElement != null)
            {
                btnRegion1.CheckedChange += (a, b) =>
                {
                    bool isChecked = b.IsChecked;
                    if (isChecked)
                        FirebaseMessaging.Instance.SubscribeToTopic("R1");
                    else
                        FirebaseMessaging.Instance.UnsubscribeFromTopic("R1");
                };

                btnRegion2.CheckedChange += (c, d) =>
                {
                    bool isChecked = d.IsChecked;
                    if (isChecked)
                        FirebaseMessaging.Instance.SubscribeToTopic("R2");
                    else
                        FirebaseMessaging.Instance.UnsubscribeFromTopic("R2");
                };

                btnRegion3.CheckedChange += (e, f) =>
                {
                    bool isChecked = f.IsChecked;
                    if (isChecked)
                        FirebaseMessaging.Instance.SubscribeToTopic("R3");
                    else
                        FirebaseMessaging.Instance.UnsubscribeFromTopic("R3");
                };

                btnRegion4.CheckedChange += (g, h) =>
                {
                    bool isChecked = h.IsChecked;
                    if (isChecked)
                        FirebaseMessaging.Instance.SubscribeToTopic("R4");
                    else
                        FirebaseMessaging.Instance.UnsubscribeFromTopic("R4");
                };

                btnRegion5.CheckedChange += (i, j) =>
                {
                    bool isChecked = j.IsChecked;
                    if (isChecked)
                        FirebaseMessaging.Instance.SubscribeToTopic("R5");
                    else
                        FirebaseMessaging.Instance.UnsubscribeFromTopic("R5");
                };
            }
        }

MainActivity.cs(默認代碼)沒有變化,如下所示:

 using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Util;
using Firebase.Iid;
using Android.Gms.Common;
using Firebase.Messaging;

namespace miemss_xamarin.Droid
{
    [Activity(Label = "miemss_xamarin", Icon = "@mipmap/icon", Theme = "@style/MainTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        TextView msgText;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
           LoadApplication(new App());
            }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

我已經嘗試了幾種解決方案,我發現如何使用 ViewRenderer 在 Xamarain.forms 上顯示 android 活動,但仍然無法完美運行。 我想在 Xamarin Forms 中顯示活動 NewViewRenderer? 現在,當我單擊區域圖標時,它會顯示一個帶有返回按鈕的空白頁面到主頁!

問題是您用於 NewViewRenderer 的基本類型:

public class NewViewRenderer : ViewRenderer<miemss_xamarin.NewView,miemss_xamarin.Droid.NewViewRenderer>

您希望您的本機控件是 Android.Views.View,而不是您的 NewViewrenderer。 所以試試這個:

public class NewViewRenderer : Xamarin.Forms.Platform.Android.ViewRenderer<NewView, Android.Views.View>

或者如果您需要 Android.AppCompat 意見:

public class NewViewRenderer : Xamarin.Forms.Platform.Android.AppCompat.ViewRenderer<NewView, Android.Views.View>

當你設置NewViewRenderer的類型時,你犯了一個錯誤。 您應該設置ViewRenderer<NewView, Android.Views.View>

[assembly: ExportRenderer(typeof(NewView), typeof(NewViewRenderer))]
namespace CustomRenderDemo.Droid
{
    public class NewViewRenderer : ViewRenderer<NewView, Android.Views.View>
    {
        NewViewRenderer newViewRenderer;
        Android.Widget.Switch btnRegion1; Android.Widget.Switch btnRegion2; Android.Widget.Switch btnRegion3; Android.Widget.Switch btnRegion4; Android.Widget.Switch btnRegion5;

        Context context;
        public NewViewRenderer(Context context) : base(context)
        {
            this.context = context;
        }
        protected override void OnElementChanged(ElementChangedEventArgs<NewView> e)
        {
            base.OnElementChanged(e);
            if (Control == null)
            {
                //  var context = new NewViewRenderer(Forms.Context);
                //SetNativeControl(context);
                var context = Android.App.Application.Context;
              var  view = LayoutInflater.From(context).Inflate(Resource.Layout.NotificationLayout, null, false); 
             //   LayoutInflater minflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;
              //  var view = minflater.Inflate(Resource.Layout.NotificationLayout, this, false);
                var msgText = view.FindViewById<TextView>(Resource.Id.msgText);
                btnRegion1 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion1);
                btnRegion2 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion2);
                btnRegion3 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion3);
                btnRegion4 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion4);
                btnRegion5 = view.FindViewById<Android.Widget.Switch>(Resource.Id.SubscribeToRegion5);
                SetNativeControl(view);
              //  AddView(view);
               // new NewView(context);
              //  SetNativeControl(new MyView(context));
              //  Control.AddView(view);
                //   base.SetNativeControl(view);
                //  It always shows red underline under view, so I
            }



            if (e.NewElement != null)
            {
                btnRegion1.CheckedChange += (a, b) =>
                {
                    bool isChecked = b.IsChecked;
                    //if (isChecked)
                    //    FirebaseMessaging.Instance.SubscribeToTopic("R1");
                    //else
                    //    FirebaseMessaging.Instance.UnsubscribeFromTopic("R1");
                };

                btnRegion2.CheckedChange += (c, d) =>
                {
                    bool isChecked = d.IsChecked;
                    //if (isChecked)
                    //    FirebaseMessaging.Instance.SubscribeToTopic("R2");
                    //else
                    //    FirebaseMessaging.Instance.UnsubscribeFromTopic("R2");
                };

                btnRegion3.CheckedChange += (e, f) =>
                {
                    bool isChecked = f.IsChecked;
                    //if (isChecked)
                    //    FirebaseMessaging.Instance.SubscribeToTopic("R3");
                    //else
                    //    FirebaseMessaging.Instance.UnsubscribeFromTopic("R3");
                };

                btnRegion4.CheckedChange += (g, h) =>
                {
                    bool isChecked = h.IsChecked;
                    //if (isChecked)
                    //    FirebaseMessaging.Instance.SubscribeToTopic("R4");
                    //else
                    //    FirebaseMessaging.Instance.UnsubscribeFromTopic("R4");
                };

                btnRegion5.CheckedChange += (i, j) =>
                {
                    bool isChecked = j.IsChecked;
                    //if (isChecked)
                    //    FirebaseMessaging.Instance.SubscribeToTopic("R5");
                    //else
                    //    FirebaseMessaging.Instance.UnsubscribeFromTopic("R5");
                };
            }

        }
    }

這是運行截圖。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM