2013-07-09 5 views
1

У меня есть простой xml, который я хочу раздуть как объект представления java. Я знаю, как надуть вид:Как надуть xml как пользовательский вид без родителя

view = LayoutInflater.from(context).inflate(R.layout.alarm_handling, this); 

Но тогда у меня есть мнение, которое является дочерним родителем (это). И тогда запутанная проблема начинается с установки параметров компоновки и наличия дополнительного макета, который мне не нужен. Это намного проще сделать в xml.

С деятельностью, которую вы можете просто вызвать: setContentView(), но с видом, который невозможен.

В конце концов, я хотел бы иметь Java-класс (расширяет ViewSomething), к которому я могу обратиться в другом xml. Я посмотрел на ViewStub, что практически является ответом, за исключением того, что оно является окончательным :(

public class AlarmView extends ViewStub{ //could work if ViewStub wasn't final 

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

    //using methods from ViewStub: 
    setLayoutResource(R.layout.alarm_handling); 
    inflate(); 
} 
} 

Так как на это? Что продлить, чтобы иметь возможность просто позвонить setContentView() или setLayoutResource()?

Я посмотрел на многие SO ответы, но ни один из них не подходит на мой вопрос.

+0

Я немного озадачен. Я считаю, что вы можете раздуть представление нулевым родителем (I.E. inflate (R.layout.alarm_handling, null) или какой-то вариант), но это очень похоже на то, что вы хотите использовать пользовательский вид из xml, что также вполне возможно. Ваша проблема в том, что вы хотите использовать наставник xml? –

+0

Я не знаю, нужен ли мне специальный надув xml. Я хочу создать пользовательский компонент, который позаботится о своем собственном макете (надуть из xml) без дополнительного (родительского) макета, который, как я думаю, является незаурядным. – bluevoid

ответ

5

, насколько я понял, трюк, который вы хотите применить это немного отличается от того, что вы пытаетесь.

нет ViewStub являются не решение, так как ViewStub имеет совершенно другой способ все.

Скажем, для примера макет XML-то вроде этого (неполное, просто чтобы показать идею):

<FrameLayout match_parent, match_parent> 
    <ImageView src="Myimage", wrap_content, Gravity.LEFT/> 
    <TextView text="hello world", wrap_content, Gravity.CENTER_HORIZONTAL/> 
</FrameLayout> 

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

Но тогда трюк заключается в использовании merge на вашем XML.

<merge match_parent, match_parent> 
    <ImageView src="Myimage", wrap_content, Gravity.LEFT/> 
    <TextView text="hello world", wrap_content, Gravity.CENTER_HORIZONTAL/> 
</merge> 

и надуть как обычно на ваш виджет, который расширяет FrameLayout

public class MyWidget extends FrameLayout 
    // and then on your initialisation/construction 
    LayoutInflater.from(context).inflate(R.layout.alarm_handling, this); 

и окончательного размещения на экране будет иметь только 1 FrameLayout.

счастливое кодирование!

+0

Прохладный, это звучит как то, что я ищу! Я попробую посмотреть, работает ли это для меня. – bluevoid

+0

Это работает прекрасно, это выведет много кода из моего проекта, где я устанавливаю LayoutParams в java-классах, чтобы все исправить. Thanx! – bluevoid

+0

Это отлично работает. Единственная проблема заключается в том, что предварительный просмотр пользовательского интерфейса в android Studio не будет знать, как показать содержимое макета, потому что он не знает, был ли исходный тег FrameLayout, LinearLayout или RelativeLayout. – gardenofwine

Смежные вопросы