2

Я, имеющий настраиваемое представление, которое будет принимать набор атрибутов (значение XML) в качестве значения конструкторазначения Alter AttributeSet в андроида

public CustomView(Context context) // No Attributes in this one. 
{ 
    super(context); 
    this(context, null, 0); 
} 

public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this(context, attrs, 0) 
} 

public CustomView(Context context, AttributeSet attrs, int default_style) { 
    super(context, attrs, default_style); 
    readAttrs(context, attrs, defStyle); 
    init(); 
} 

В классе Fragment я ставлю точку зрения, как

CustomView customView = (CustomView) view.findViewById(R.id.customView); 

где пользовательские view содержит различное значение, такое как высота, ширина, заполнение и т. д.

Я хочу изменить эти значения на основе требуемого условия и вернуть его к пользовательскому виду. Я установил код высоты ширины установки в onDraw и назвал вид invalidte. Но выше метод будет устанавливать каждый раз, если я вызвал недействительным метод в классе CustomView. как преодолеть это, чтобы я мог передавать измененное значение набора атрибутов только в конструкторе.?

Редактировать: Мне нужно изменить значения представления (инициализировать новыми значениями), которые устанавливаются во время создания атрибута, чтобы я получил обновленное представление с новыми значениями. Override @OnDraw или 'Invalidate' не является хорошей функцией для меня, где внутри invalidate я написал методы, которые будут выполняться в каждом втором интервале.

+0

Попробуйте установить 'LayoutParams' для вас' CustomView'. таким образом вы можете изменить свои значения на основе требуемого условия. – astuter

+0

@astuter Значения CustomView - это не только ширина, высота и т. Д. Значения, которые определяются во взгляде, такие как цвет, showText, ShowColor, ShowGraph. и т.д. –

ответ

0

Это, вероятно, не решение, которое вы надеялись, но поставить FrameLayout в вашем XML вместо CustomView, а затем создать CustomView программно с FrameLayout, как это родительский

+0

Спасибо. Моя проблема заключается в необходимости передавать пользовательские параметры, такие как Customview.angle, customView.isIntialized как параметры, которые ранее были установлены в атрибут xml. –

0

Поэтому давайте скажем, что вы указали свои пользовательские атрибуты, подобные этому, для просмотра Stars Stars

<declare-styleable name="StarsView"> 
    <attr name="stars" format="integer" /> 
    <attr name="score" format="float" /> 
</declare-styleable> 

И вы хотите прочитать атрибут тес от чего-то вроде этого

<my.package..StarsView 
    app:stars="5" 
    app:score="4.6" 

Вы делаете только это в конструкторе

public StarsView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    if(attrs != null) { 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StarsView, defStyleAttr, 0); 
     stars = Tools.MathEx.clamp(1, 10, a.getInt(R.styleable.StarsView_stars, 5)); 
     score = (int)Math.floor(a.getFloat(R.styleable.StarsView_score, stars) * 2f); 
     a.recycle(); // its important to call recycle after we are done 
    } 
} 
+0

Чтение в моем случае отлично; Проблема в том, что мне нужно изменить значение на основе условия и обновить только те значения. Ex: У меня есть десять атрибутов, и мне нужно изменить только два атрибута и обновить представление. –

+0

Я думаю, что я не получу его немного, AttributeSet, который вы получаете при построении представления, - это просто способ Android, позволяющий читать XML-данные, и, конечно, когда я читаю мои звезды = 5, и что писать в textView 5, я бы просто установите это значение, когда я создаю set View – Inverce

+0

также добавьте методы set/get для ваших переменных, которые представляют эти атрибуты в вашем представлении, поэтому вы можете изменить их код перекоса – Inverce

2

Я вижу, что ваш CustomView может иметь несколько атрибутов, и вы хотите изменить некоторые из этих атрибутов на основе некоторого условия и передать в конструкторе.

Несколько лучших практик при разработке пользовательского вида:

  1. Если у вас есть пользовательские атрибуты, убедитесь, что вы подвергаете их с помощью сеттеров и добытчиками. В методе сеттера вызовите invalidate();
  2. Не пытайтесь изменить любые атрибуты внутри onDraw() или onMeasure() методов.
  3. Приложите все усилия, чтобы избежать написания пользовательских конструкторов для вашего пользовательского вида.

Так что идеальный способ, чтобы решить вашу проблему, чтобы создать экземпляр CustomView, а затем изменить атрибуты, либо извне (в вашей деятельности или фрагмента), или есть метод внутри CustomView.java, а затем вызвать его извне. Выполнение этого по-прежнему даст вам тот же результат, который вы ищете.

+0

Спасибо. Это то, что я ищу. Мне нужно изменить значения пользовательских атрибутов, чтобы я мог аннулировать мои взгляды, чтобы их отразить. –

+0

Я бы предположил, что у вас есть метод внутри CustomView, который выполняет условную проверку (если она является общей) и на основе этого изменяет атрибуты с помощью методов setter для ваших атрибутов. Надеюсь это поможет. – Henry