AttributeSet

Ответить
bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

AttributeSet

Сообщение bundos » 26 июл 2013, 00:01

Я так и не понял, зачем нужен интерфейс AttibuteSet. В оффхелпе написано, что можно получить реализацию используя файл ресурсов с атрибутами.[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Options">
<attr name="titleText" format="string" localization="suggested" />
<attr name="valueColor" format="color" />
</declare-styleable>

</resources> [/syntax]
Как и указано в хелпе я создал реализацию AttributeSet для данного XML. Передал его в LayoutParams в конструктор и ничего не произошло, скормил получившийся LayoutParams обхекту TexView и приложение начало падать. Вот код: [syntax=java]protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv =(TextView) findViewById(R.id.tView);
XmlPullParser parser=getResources().getXml(R.xml.yt);
AttributeSet attrs= Xml.asAttributeSet(parser);
LayoutParams lp = new LayoutParams(this, attrs);
tv.setLayoutParams(lp);

}[/syntax]
Вот лог:

Код: Выделить всё

07-25 22:11:47.629: E/AndroidRuntime(590): FATAL EXCEPTION: main
07-25 22:11:47.629: E/AndroidRuntime(590): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.p00141_menuadv/com.example.p00141_menuadv.MainActivity}: java.lang.RuntimeException: Binary XML file line #-1: You must supply a layout_width attribute.
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.os.Looper.loop(Looper.java:123)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at java.lang.reflect.Method.invoke(Method.java:521)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at dalvik.system.NativeStart.main(Native Method)
07-25 22:11:47.629: E/AndroidRuntime(590): Caused by: java.lang.RuntimeException: Binary XML file line #-1: You must supply a layout_width attribute.
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:3592)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.view.ViewGroup$LayoutParams.<init>(ViewGroup.java:3545)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at com.example.p00141_menuadv.MainActivity.onCreate(MainActivity.java:32)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-25 22:11:47.629: E/AndroidRuntime(590): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-25 22:11:47.629: E/AndroidRuntime(590): 	... 11 more
Собственно справедливо, что отствуюет атрибут layout_width. Но ворпос не в этом, какую инфу несет этот хмльник с атриутами?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: AttributeSet

Сообщение Finch » 26 июл 2013, 02:30

создаешь свои кастомные вьюшки, к ним атрибуты, очень полезная фича.
Надеюсь это развеет туман в твоей голове http://developer.android.com/training/c ... -view.html
CEO of a company R.id.team

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: AttributeSet

Сообщение bundos » 27 июл 2013, 11:12

Finch, Посмотрел тот мануал, но так и не понял вот что: Мы создали xml с атрибутами и класс, наследующийся от View. В упор не могу понять, за что отвечают эти атрибуты, где мы это определяем.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: AttributeSet

Сообщение Finch » 27 июл 2013, 13:29

омг ну как так
вот создается кастомная вьюха

class PieChart extends View {
public PieChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
}

в res/values/attrs.xml создаешь <declare-styleable> с тем же именем что и имя класса
<resources>
<declare-styleable name="PieChart">
<attr name="showText" format="boolean" />
<attr name="labelPosition" format="enum">
<enum name="left" value="0"/>
<enum name="right" value="1"/>
</attr>
</declare-styleable>
</resources>

потом в res/layout создаешь xml в нем прописываешь свою кастомную вьюху, также как TextView, ImageView etc... и тебе становятся доступными параметры которые ты задекларировал custom:showText="true", custom:labelPosition="left". Можешь создавать огромную кучу параметров.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com. ... ustomviews">
<com.example.customviews.charting.PieChart
custom:showText="true"
custom:labelPosition="left" />
</LinearLayout>

Дальше имя лэйаута ты указываешь в onCreate в своей активити в методе setContentView(ИМЯ_ЛЭЙАУТА);

Теперь понятно?
CEO of a company R.id.team

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: AttributeSet

Сообщение bundos » 27 июл 2013, 15:35

Это все почти понятно. Вы декларировали атрибуты showText и labelPostion. Я могу, как понял, написать название <resources>
<declare-styleable name="PieChart">
<attr name="attr1" format="boolean" />
<attr name="attr2" format="enum">
<enum name="name1" value="0"/>
<enum name="name2" value="1"/>
</attr>
</declare-styleable>
</resources>
Ну будут у моей кастомной вьюхи эти атрибуты, установил я их допустим
custom:attr1="true"
custom:attr2="name2", как это на самой вьюхе отразится? Разве мы не должны определять в коде, за что конкретно отвечают атрибуты?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: AttributeSet

Сообщение Finch » 27 июл 2013, 21:34

Хватит с меня, читай документацию там все есть.
CEO of a company R.id.team

bundos
Сообщения: 38
Зарегистрирован: 05 май 2013, 13:43

Re: AttributeSet

Сообщение bundos » 27 июл 2013, 22:19

Ткните пальцем, где? Я не нашел, а если бы нашел то наверное не спрашивал.
Finch писал(а):Хватит с меня, читай документацию там все есть.
Справедливо, да. Тогда зачем здесь задают вопросы если в документации все есть? Непонятно :?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: AttributeSet

Сообщение Finch » 27 июл 2013, 23:01

Я тоже не могу понять, зачем спрашивать если все есть в документации, на то она и докментация.
CEO of a company R.id.team

Ответить