小编Joh*_*ehl的帖子

泛型类中的 C# 方法仅适用于某些类型

我试图在仅限于特定类型的泛型类上定义一个方法。我想出了这个:

interface IHasId 
{
    int Id { get; }
}

public class Foo<T>
{
    private List<T> children;

    public IHasId GetById(int id)
    {
        foreach (var child in children.Cast<IHasId>())
        {
            if (child.Id == id)
            {
                return child;
            }
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

它会起作用,但看起来像代码味道......似乎应该有一种方法让编译器强制执行此操作。就像是:

public class Foo<T>
{
    public IHasId GetById<TWithId>(int id) where TWithId : IHasId {}
}
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好:

public class Foo<T>
{
    public IHasId GetById(int id) where T : IHasId {}
}
Run Code Online (Sandbox Code Playgroud)

我看到了一些与 Java 相关的帖子,其中一篇专门讨论了将 T 限制为枚举,但没有直接说到重点。

c# generics

10
推荐指数
1
解决办法
1万
查看次数

无法在XML中找到AAR中的资源标识符

我为应用程序开发了一个自定义首选项.它有两个自定义属性.我正在尝试将Preference移动到库项目以在其他项目中重用.我将Java文件与相应的布局和attr XML文件一起移动.这是库项目中的attr文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="NumberPickerPreference" >
        <attr name="minValue" format="integer" />
        <attr name="maxValue" format="integer" />
    </declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

这是清单:

<manifest package="com.mydomain.androiduilibrary">
</manifest>
Run Code Online (Sandbox Code Playgroud)

一个奇怪的表现肯定.当我生成库项目时,Android Studio中唯一放入清单的是SDK信息,然后生成一个警告,它已经在build.gradle文件中指定了,所以我删除了清单中的条目.

我使用bundleRelease任务生成AAR文件,并获取名为androiduilibrary-release.aar的文件.然后我转到需要使用此Preference的项目并选择"New Module | Import .JAR或.AAR Package",导航到AAR,它现在在我的项目中作为名为androiduilibrary-release的模块.我在Project Structure对话框中创建了一个模块依赖项,现在可以在Java代码中引用Preference.到现在为止还挺好.

但是,当我尝试在XML中引用Preference时,我的自定义属性出现以下错误:"错误:(9)在"com.mydomain.androiduilibrary"包中找不到属性"minValue"的资源标识符.这是XML:

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:title="@string/location_service_settings_preference_header_title"
    xmlns:custom="http://schemas.android.com/apk/res/com.mydomain.androiduilibrary">

<com.mydomain.androiduilibrary.NumberPickerPreference
    android:title="@string/update_interval_preference_title"
    android:key="@string/update_interval_preference_key"
    android:defaultValue="@integer/update_interval_preference_default"
    android:summary="@string/update_interval_preference_summary"
    custom:minValue="@integer/update_interval_preference_min"
    custom:maxValue="@integer/update_interval_preference_max"
    android:dialogMessage="@string/update_interval_preference_dialog_message"
    android:dialogTitle="@string/update_interval_preference_title" />
Run Code Online (Sandbox Code Playgroud)

我可以查看AAR内部,看到值是在R.txt中填充的:

int attr maxValue 0x7f010001
int attr minValue 0x7f010000
Run Code Online (Sandbox Code Playgroud)

它的清单正确创建:

<?xml version="1.0" encoding="UTF-8"?>

<manifest android:versionName="1.0" android:versionCode="1"
    xmlns:android="http://schemas.android.com/apk/res/android" package="com.mydomain.androiduilibrary">

    <uses-sdk android:targetSdkVersion="21" android:minSdkVersion="11"/>

</manifest>
Run Code Online (Sandbox Code Playgroud)

在调用自定义首选项时我也会收到警告:"此处不允许使用元素com.mydomain.androiduilibrary.NumberPickerPreference",所以我猜这也是一个问题.

我是否缺少一个允许我在XML中引用AAR元素的步骤?我正在使用Android Studio 1.0.2.提前致谢.

android android-library android-studio aar

7
推荐指数
1
解决办法
6162
查看次数

标签 统计

aar ×1

android ×1

android-library ×1

android-studio ×1

c# ×1

generics ×1