Определение пользовательских атрибутов

Ничего не нужно. Просто используйте nextset:


import pyodbc

db = pyodbc.connect ("")
q = db.cursor ()
q.execute ("""
SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES
SELECT TOP 10 * FROM INFORMATION_SCHEMA.COLUMNS
""")
tables = q.fetchall ()
q.nextset ()
columns = q.fetchall ()

assert len (tables) == 5
assert len (columns) == 10

439
задан Suragch 11 February 2017 в 09:25
поделиться

2 ответа

В настоящее время лучшей документацией является источник. Вы можете взглянуть на это здесь (attrs.xml) .

Вы можете определить атрибуты в верхнем элементе <resources> или внутри элемента <declare-styleable>. Если я собираюсь использовать attr более чем в одном месте, я помещаю его в корневой элемент. Обратите внимание, что все атрибуты имеют одно и то же глобальное пространство имен. Это означает, что даже если вы создадите новый атрибут внутри элемента <declare-styleable>, его можно будет использовать вне его, и вы не сможете создать другой атрибут с тем же именем другого типа.

Элемент <attr> имеет два атрибута xml name и format. name позволяет вам называть это чем-то, и именно так вы в конечном итоге ссылаетесь на это в коде, например, R.attr.my_attribute. Атрибут format может иметь разные значения в зависимости от типа атрибута, который вы хотите.

  • ссылка - если она ссылается на другой идентификатор ресурса (например, "@ color / my_color", "@ layout / my_layout")
  • color
  • логический
  • ]
  • размерность
  • число с плавающей запятой
  • целое число
  • строка
  • дробь
  • перечисление - обычно неявно определяется
  • flag - обычно неявно определяется

Вы можете установить формат для нескольких типов, используя |, например, format="reference|color".

Атрибуты

enum могут быть определены следующим образом: атрибуты

<attr name="my_enum_attr">
  <enum name="value1" value="1" />
  <enum name="value2" value="2" />
</attr>

flag похожи, за исключением того, что необходимо определить значения, чтобы их можно было объединить в биты:

<attr name="my_flag_attr">
  <flag name="fuzzy" value="0x01" />
  <flag name="cold" value="0x02" />
</attr>

В дополнение к атрибутам есть элемент <declare-styleable>. Это позволяет вам определять атрибуты, которые может использовать пользовательский вид. Вы делаете это, указывая элемент <attr>, если он был определен ранее, вы не указываете format. Если вы хотите повторно использовать атрибут Android, например, Android: gravity, то вы можете сделать это в name следующим образом.

Пример настраиваемого представления <declare-styleable>:

<declare-styleable name="MyCustomView">
  <attr name="my_custom_attribute" />
  <attr name="android:gravity" />
</declare-styleable>

При определении пользовательских атрибутов в XML для настраиваемого представления необходимо выполнить несколько действий. Сначала вы должны объявить пространство имен, чтобы найти ваши атрибуты. Вы делаете это с корневым элементом макета. Обычно есть только xmlns:android="http://schemas.android.com/apk/res/android". Теперь вы также должны добавить xmlns:whatever="http://schemas.android.com/apk/res-auto".

Пример:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:whatever="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <org.example.mypackage.MyCustomView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      whatever:my_custom_attribute="Hello, world!" />
</LinearLayout>

Наконец, для доступа к этому пользовательскому атрибуту вы обычно делаете это в конструкторе вашего пользовательского представления следующим образом.

public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);

  String str = a.getString(R.styleable.MyCustomView_my_custom_attribute);

  //do something with str

  a.recycle();
}

Конец. :) [Тысяча сто сорок семь]

918
ответ дан Austyn Mahoney 11 February 2017 в 09:25
поделиться

если Вы опускаете эти format атрибут от attr элемент, можно использовать его для ссылки на класс от разметок XML.

  • пример от attrs.xml .
  • Studio Android понимает, что на класс ссылаются от XML
    • т.е. <ул.> <литий> Refactor > Rename работы <литий> Find Usages, работы <литий> и так далее...

не указывают format атрибут в [1 119] .../src/main/res/values/attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="MyCustomView">
        ....
        <attr name="give_me_a_class"/>
        ....
    </declare-styleable>

</resources>

использование это в некотором файле расположения, .../src/main/res/layout/activity__main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<SomeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- make sure to use $ dollar signs for nested classes -->
    <MyCustomView
        app:give_me_a_class="class.type.name.Outer$Nested/>

    <MyCustomView
        app:give_me_a_class="class.type.name.AnotherClass/>

</SomeLayout>

анализирует класс в Вашем коде инициализации представления .../src/main/java/.../MyCustomView.kt

class MyCustomView(
        context:Context,
        attrs:AttributeSet)
    :View(context,attrs)
{
    // parse XML attributes
    ....
    private val giveMeAClass:SomeCustomInterface
    init
    {
        context.theme.obtainStyledAttributes(attrs,R.styleable.ColorPreference,0,0).apply()
        {
            try
            {
                // very important to use the class loader from the passed-in context
                giveMeAClass = context::class.java.classLoader!!
                        .loadClass(getString(R.styleable.MyCustomView_give_me_a_class))
                        .newInstance() // instantiate using 0-args constructor
                        .let {it as SomeCustomInterface}
            }
            finally
            {
                recycle()
            }
        }
    }
0
ответ дан 22 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: