zoukankan      html  css  js  c++  java
  • Xamarin.Android开发中遇到的问题

    开发

    1、Resource.Id未包含xxx的定义

    打开了一个OK的Id,是位于objDebug90designtimeResource.designer.cs ,打开文件搜索xxx,果然没有。

    删除此文件 重新生成项目,并没有重新生成Resource.designer.cs 

    解决方法:

    删除整个obj文件夹,重新生成项目;

    或者重启VS,自动重新生成Resource.designer.cs了,并且含有xxx

    2、Button文本默认大写

    参考:xamarin forms中的Button文本默认大写

    将按钮的属性textAllCaps都改为false。默认没有设置 是true。

    3、ADB0020: Android ABI 不匹配。

    问题1:你正将应用支持的“armeabi,armeabi-v7a,x86”ABI 部署到 ABI“x86_64”的不兼容设备。应创建匹配其中一个应用 ABI 的仿真程序,或将“x86_64”添加到应用生成的 ABI 列表中

    问题原因:应该是选择的模拟器(X86_64)不匹配,需要创建一个“armeabi,armeabi-v7a,x86”是模拟器来调试。

    或者看下“使用共享运行时”是否选中

    参考:

    说说Android项目中的armeabi,armeabi-v7a和x86

    Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    问题2:Please open the Android SDK Manager and install the latest version of 'Android Support Repository' from the 'Extras' section, and then reload your solution.

    问题原因:上一步选择X86处理器后,需要安装相应的SDK,和工具中的Android Support Repository

    4、方法过时

    4.1   [Obsolete("This constructor is obsolete as of version 2.5. Please use PageRenderer(Context) instead.")]

    在使用PageRenderer时提示这个构造函数已经过时,发生这种情况的原因是从v2.5版本开始的Xamarin.Forms非常简单,将Xamarin.Forms.Forms的Context属性标记为过时。 因此,要获取渲染器的全局上下文,有必要调用该渲染器的基类,这意味着在构造函数中,您需要执行以下操作: 添加以下代码即可(Please use PageRenderer(Context) instead.)

    public WriteEmailPageRenderer(Context context) : base(context)
            {
            }

    参考:How do I resolve WebViewRenderer is obsolete

    4.2 Context is obsolete as of version 2.5. Please use a local context instead

    报过时的写法:Android.Content.Context content = Forms.Context;  或者  Activity activity = (Activity)Forms.Context;

    在Dependencies中定义特定平台的功能时,使用Forms.Context会提示已过时,请改为使用本地环境。

    解决方案是在不引用Xamarin.Forms.Forms.Context的情况下获取本地上下文

    注:Android.Content.Context是应用程序环境全局信息上下文,Activity都是继承自此类。

    有两种方式解决:

    方式1、在接口中提供Init(),然后在MainActivity中调用:VersionHelper.Init(this);

    public class VersionHelper : IVersionHelper
        {
            static Context _context;
    
            public static void Init(Context context)
            {
                _context = context;
            }
    ...

    方式2、在MainActivity类中创建一个静态属性,并将其设置为MainActivity实例:

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        internal static MainActivity Instance { get; private set; }
    
        protected override void OnCreate(Bundle bundle)
        {
            ...
            global::Xamarin.Forms.Forms.Init(this, bundle);
            Instance = this;
            Xamarin.Forms.DependencyService.Register<IVersionHelper, VersionHelper>();
            LoadApplication(new App());
        }
    }
    View Code

    然后接口中使用

    using Android.Content;
    
    namespace DependencyServiceAndLocalContext.Droid
    {
        public class VersionHelper : IVersionHelper
        {
            public string GetVersionNumber()
            {
                var versionNumber = string.Empty;
                if (MainActivity.Instance != null)
                {
                    versionNumber = MainActivity.Instance.PackageManager.GetPackageInfo(
                        MainActivity.Instance.PackageName, 0).VersionName;
                }
                return versionNumber;
            }
        }
    }
    View Code

    参考:Xamarin.Forms 2.5 and Local Context on Android

    调试

    1、Xamarin.android不能显示网络、远程图片 

    调试时从IDE的输出可以看出原因:Image load failed: System.ObjectDisposedException: Can not access a closed Stream. 不知这个问题是不是还没有去修复,还是不准备修复

    因为看到Mircsoft官方示例eshop都是用的一个开源包:https://github.com/luberda-molinet/FFImageLoading 

    注意:各个平台需要调用: CachedImageRenderer.Init(false);   【上述github有使用方法】

    否则 会报错:

      "Please call CachedImageRenderer.Init method in a platform specific project to use FFImageLoading!"

    2、Can't install because provider name com.xxx.fileprovider (in package yyy) is already used by com.mesince]

    这个问题其实本质就是手机里已经安装有同名的Provider的APK了.

    比如我在甲APP(com.xxx)中的AndroidManifest.xml中定义了一个Provider,
    安装完这个甲APP,
    我把代码里的ApplicationId改成com.yyy,即换皮成乙APP(com.yyy) ,
    此时如果没有把Providerandroid:authorities的属性也换掉,
    安装乙APP到手机上,provider就会和甲APP的冲突.

    需要修改项目中的配置文件:AndroidManifest.xml,可以改为如下
    android:authorities= ${applicationId}.provider

    参考:[Android] 该文件包与具有同一名称的现有文件包存在冲突

    3、Android http 不能联网:Cleartext HTTP traffic to not permitted

    在尝试 请求外部的WebApi时,报出错误。

    解决:在AndroidManifest.xml配置文件的<application>标签中插入:   

    android:usesCleartextTraffic="true"

    4、Android模拟机时间修改

    没做任何修改的前提下,其时间是美国纽约的时区,相对中国是-8小时的。所以程序中DateTime.Now获取的比中国时间小8小时

    可以自己修改为和中国一样。 

    本来想设置 图中1处的时区,但是发现没有中国的。于是直接改图中2处的时间。

    参考:安卓模拟器怎么设置时间日期

    5、listView.ScrollTo不生效

    需要看下滚动的代码是否有UI线程执行的

    txtMessage.Focused += TxtMessage_Focused;
    
    private void TxtMessage_Focused(object sender, FocusEventArgs e)
            {
                if (listChatMessage.Count > 0)
                {
                    Task.Delay(100).ContinueWith((t) =>
                    {
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            listView.ScrollTo(listChatMessage.Last(), ScrollToPosition.End, false);
                        });
                    });
                }
            }

    参考:xamarin优化listView.ScrollTo

    6、not attached to window manager

    not attached to window manager有许多场景发生。最近在做设备锁时,弹出进度圈和取消时碰到此问题

    调试判断出大概是Activity 已经销毁了,再调Dismiss时失败,,【泄露】

    最终修改代码,发现确实是开启的dialog在Activity销毁之前,没有关闭。。然后在Activity销毁了再去dismiss。

    7、Unable to add window -- token android.os.BinderProxy@b1bab0a is not valid; is your activity running?

    最近在做设备锁时,需要弹窗的地方碰到此问题

    问题:Activity不是处于运行状态

    调试查看报错处的Activity是哪个,代码中写的是Activity context = (Activity)Forms.Context;

    System.Console.WriteLine(TAG + context.LocalClassName);
    发现此Activity调用了OnDestroy()马上就销毁了,所以他不是在运行中。。

    修改Activity的赋值:Activity activity = MainActivity.Instance;  

    8、net::ERR_CLEARTEXT_NOT_PERMITTED

    在安卓9.0中调试WebView加载网页时错误。

    解决方法: 在AndroidManifest文件中的节点Application中加入 android:usesCleartextTraffic="true"

    9、Xamarin.forms包加入不进

    在迁移一个项目后,Xamarin.Android中本来有Xamarin.Forms这个包的,但是同事从远程拉取代码后,没有显示此包,导致调试不通过。

    报错(17个错误):style attribute 'attr/colorPrimaryDark (aka com.mesince:attr/colorPrimaryDar

     在Nuget中引入了 但还是不行。后来尝试 从解决方案中卸载此Xamarin.Android项目,重新添加,居然可以显示了,好奇怪的问题!

  • 相关阅读:
    bzoj3033
    noip2016 Day1T3
    编译php的问题
    JavaScript <script>标签的位置、延迟脚本(defer属性)与 异步脚本(async属性)
    连接远程数据库时出现 SSH: expected key exchange group packet from server / 2003
    laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy
    laravel 生成 key
    windows下apache配置虚拟主机
    composer设置忽略版本匹配
    laravel 服务容器实例——深入理解IoC模式
  • 原文地址:https://www.cnblogs.com/peterYong/p/11534341.html
Copyright © 2011-2022 走看看