Nano Hash - криптовалюты, майнинг, программирование

Пользовательское представление (не ViewGroup), созданное на основе макета xml (с предопределенными атрибутами)

Я хочу реализовать собственный ImageView с некоторыми предопределенными атрибутами на основе файла xml. Для этого я подготовил макет, заключенный в тег merge:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        android:src="@drawable/icon" />
</merge>

И расширенный класс ImageView:

public class CustomImageView extends LinearLayout{

    public ImageFormField(Context context) {
        super(context);
        init();
    }

    public ImageFormField(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ImageFormField(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public ImageFormField(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        View.inflate(getContext(), R.layout.custom_image_view, this);
    }
}

Пока это работает, но на самом деле мне не нужен этот LinearLayout, так как я мог бы расширить его непосредственно из ImageView. Расширяя ImageView, я хотел бы иметь возможность переопределить параметр src из макета по умолчанию.

Поэтому я удалил тег merge, чтобы в макете было только ImageView, и попробовал это:

public class CustomImageView extends AppCompatImageView{

    public ImageFormField(Context context) {
        super(context);
        init();
    }

    public ImageFormField(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ImageFormField(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        View.inflate(getContext(), R.layout.custom_image_view, null); //can't pass root here
    }
}

... но изображение просто не отображается. Я хочу иметь возможность использовать свое представление следующим образом:

<com.my.package.CustomImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

с возможностью переопределения атрибута src. Есть ли способ сделать это, раздувая макет, или мне нужно углубляться в атрибуты (включая пользовательские)?

ОБНОВЛЕНИЕ Под «переопределением атрибута src» я подразумеваю, что по умолчанию изображение будет иметь источник из своего XML-файла, но пользователь может использовать его таким образом, чтобы передать другое значение в этом пользовательском представлении:

<com.my.package.CustomImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/another_icon" />

  • Я думаю, попробуйте использовать атрибут src с пользовательским атрибутом в XML, он должен работать, если вы расширяете представление изображения. 20.02.2018

Ответы:


1

Чтобы предоставить изображение «по умолчанию», но также позволить пользователю переопределить это значение по умолчанию, указав атрибут android:src, вы можете сделать это:

package com.example.stackoverflow;

import android.content.Context;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;

public class CustomImageView extends AppCompatImageView {

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        if (getDrawable() == null) {
            setImageResource(R.drawable.default_image);
        }
    }
}

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

<!-- will display `default_image` -->
<com.example.stackoverflow.CustomImageView
    android:layout_width="200dp"
    android:layout_height="200dp"/>

Or:

<!-- will display `other_image` -->
<com.example.stackoverflow.CustomImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/other_image"/>

Нет необходимости надувать что-либо внутри представления пользовательского изображения и создавать собственные атрибуты (хотя вы, безусловно, можете создавать собственные атрибуты и использовать их, если хотите).

Вы можете обновить код Java, чтобы применить и другие стили «по умолчанию».

20.02.2018
  • Спасибо за Ваш ответ. Я обновил свой вопрос, так что, возможно, он более понятен. В основном мне нужны значения по умолчанию для атрибутов в моем пользовательском представлении. Что-то вроде стиля, достигнутого с помощью пользовательского вида. 21.02.2018
  • @qbeck Обновление не проясняет для меня ситуацию. Вы говорите, что «пользователь может использовать это таким образом»… каким образом? Что значит «переопределить»? Какие xml-файлы вы имеете в виду? 21.02.2018
  • @qbeck Я обновил свой ответ тем, что, как я думаю, вы искали. 21.02.2018
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..