Урок 40. LayoutInflater. Учимся использовать.

Обсуждение уроков
Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 10:57

ну у меня так получается есть главный линеарлайот ... в меню есть выбор другой величины ... и вот при смене величины я делаю так:

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

int name = data.getIntExtra("napravlenie", 1);

((ScrollView) findViewById(R.id.scroll_Times)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_Dlina)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_Massa)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_Temp)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_Obem)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_energiy)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_moshnost)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_ploshad)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_davlenie)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_speed)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_elenergy)).setVisibility(View.GONE);
((ScrollView) findViewById(R.id.Scroll_Chisla)).setVisibility(View.GONE);

if (name == 1) {
((ScrollView) findViewById(R.id.Scroll_Dlina)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.length);
}
if (name == 2) {
((ScrollView) findViewById(R.id.Scroll_Massa)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.massa);
}
if (name == 3) {
((ScrollView) findViewById(R.id.Scroll_Temp)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.temperature);
}
if (name == 4) {
((ScrollView) findViewById(R.id.scroll_Times)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.times);
}
if (name == 5) {
((ScrollView) findViewById(R.id.Scroll_Obem)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.obem);
}
if (name == 6) {
((ScrollView) findViewById(R.id.Scroll_energiy)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.energiya);
}
if (name == 7) {
((ScrollView) findViewById(R.id.Scroll_moshnost)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.moshnost);
}
if (name == 8) {
((ScrollView) findViewById(R.id.Scroll_ploshad)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.ploshad);
}
if (name == 9) {
((ScrollView) findViewById(R.id.Scroll_davlenie)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.davlenie);
}
if (name == 10) {
((ScrollView) findViewById(R.id.Scroll_speed)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.speed);
}
if (name == 11) {
((ScrollView) findViewById(R.id.Scroll_elenergy)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.eltok);
}
if (name == 12) {
((ScrollView) findViewById(R.id.Scroll_Chisla)).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.textHeader)).setText(R.string.chisla);
}

}
с тем что собрался сделать сдесь будет не изменение visible а именно очистка главного лайота и добавление в него того файла ... с добавлением уже разобрался. ..

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

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View childLayout = inflater.inflate(R.layout.l_times, (ViewGroup) findViewById(R.layout.l_times));
((LinearLayout) findViewById(R.id.LinearLayout1)).addView(childLayout); 
но столкнулся с проблемой из за которой и пишу сюда ... что до добавления я не могу работать с виевом ... тоесть в oncreate приложения у меня к каждому виеву добавляется обработчик ...

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

((EditText) findViewById(R.id.EditNanosec)).addTextChangedListener(new TextWatcher() {
а теперь на этом ошибка ... потомучто пока едит EditNanosec не будет в этом xml он не может к нему доступ получить ...
пробовал ради теста сделать ...settext... для EditNanosec до LayoutInflater inflater ..... и после если до то ошибку выдает ... если после то норм с ним работает ...

так вот как мне быть ... как присобачить ети обработчики до добавления самих виевов ....

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 11:16

идея вообщем заключается в том что на главной форме будет линеарлайот и в нем форма допустим для перевода времени ...
если я выбираю в меню перевод длины .. то линеар лайот очищается и в него грузится форма для перевода длины с dlina.xml .... загрузку с другого xml я понял как делать ... а как до того как подгружу этот dlina.xml обратится к компонентам которые там чтобы к ним прикрепить обработку addTextChangedListener ???

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 11:28

так для этого ж и существует LayoutInflater:

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

View row = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate(R.layout.dlina, (ViewGroup)this.getParent(), false);
TextView label = (TextView)row.findViewById(R.id.tvLabel);
как то так, не тестил но должно прокатить.
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 11:29

ага идею понял спасибо... тоесть так я смогу обратиться к элементу до добавления его на форму ?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 11:33

нет, это после, как вы себе представляете обращаться к элементу которого не существует? и зачем к нему обращатся если его нету?
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 11:36

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 11:40

так подождите, как вы прикрепляете addTextChangedListener если EditText ещё не существует? Или вы меня запутали или я чего то не понимаю.
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 11:41

у вас есть скайп былобы проще обьяснить ... ?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 11:44

кинул в ЛС.
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение AndreyI » 04 окт 2012, 12:09

caHek2x писал(а):ага идею понял спасибо... тоесть так я смогу обратиться к элементу до добавления его на форму ?
К несуществующему элементу никак.
А вот после его создания можно

View childLayout = inflater.inflate(R.layout.l_times, (ViewGroup) findViewById(R.layout.l_times));
((EditText)childLayout.findViewById(R.id.EditNanosec)).addTextChangedListener(new TextWatcher().....

Vic
Сообщения: 6
Зарегистрирован: 14 ноя 2012, 08:39

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Vic » 23 ноя 2012, 09:24

"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Благодаря этому результату у нас строки

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

 ((TextView) view1).getText()
 ((TextView) view2).getText()
, которые были до изменения, перестают соответствовать объектам, и, если их не удалить, то приложение умирает с ошибкой.

Я не удалил, за что и получил возможность поискать причины неработоспособности программы :)

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение AndreyI » 23 ноя 2012, 09:32

Все верно, но эти объекты можно получить вызовом findViewById на полученном layout-е

ValeriusSR
Сообщения: 9
Зарегистрирован: 14 дек 2012, 09:14

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение ValeriusSR » 14 дек 2012, 09:31

Здравствуйте!
А у меня вот такой вопрос.

Мой layout.xml содержит N практически одинаковых View:

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

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:height="@dimen/button_height"
            ...
            ...
            android:text="Text" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:height="@dimen/button_height"
            ...
            ...
            android:text="Text" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:height="@dimen/button_height"
            ...
            ...
            android:text="Text" />


           и так далее...

</LinearLayout>
Неудобно править атрибуты N раз. Логично создать новый View - MyButton, и внедрять уже его.

Создаю my_button.xml

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

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ...
    ...
    ...
    android:height="@dimen/button_height" >

</Button>
Класс MyButton

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

public class MyButton extends Button {

	public MyButton(Context context) {
		super(context);
                init(context, null, 0);
	}

	public MyButton(Context context, AttributeSet attrs) {
		super(context, attrs);
                init(context, attrs, 0);
	}

	public MyButton(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
                init(context, attrs, defStyle);
	}

        private void init(Context context, AttributeSet attrs, int defStyle) {
                LayoutInflater _li = (LayoutInflater)getContext().getSystemService(_Context.LAYOUT_INFLATER_SERVICE);
                _li.inflate(R.layout.my_button, null, false);
        }

}
Применяю

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

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <MyButton
           android:text="Text" />
        <MyButton
           android:text="Text" />
        <MyButton
           android:text="Text" />
        <MyButton
           android:text="Text" />
        <MyButton
           android:text="Text" />

           и так далее...

</LinearLayout>
... И не вижу батонов на лейауте.

Я понимаю, что это из-за _li.inflate(R.layout.my_button, null, false) в методе MyButton::init(...).

Но в этом месте я еще не знаю, кто будет рутом объектов MyButton.
По идее в layout.xml, там где я размещаю MyButton, компилятор должен автоматически подхватить объекты и разместить внутри LinearLayout,
но, как видно, этого не происходит.

А как же тогда со штатными View: Button, TextView, etc.. ? С ними же нет проблем.

Что посоветуете? Как это решить?

---------------------
С уважением, ВВК

Klafe
Сообщения: 16
Зарегистрирован: 28 дек 2012, 10:05

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Klafe » 12 янв 2013, 05:43

Скажите пожалуйста, если есть кто живой и знающий:

у меня есть лэйаут item, в нем три техтвьювера, если я напишу

View one = getLayoutInflater().inflate(R.layout.item, linLayout, false);

Что мне вернется, ведь item - это ViewGroup.

Спасибо.

Snakebyte
Сообщения: 20
Зарегистрирован: 20 дек 2012, 08:18

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Snakebyte » 12 янв 2013, 13:36

view и вернется. Если нужен доступ к внутренним элементам, прописываешь их id в item и получаешь с помощью view.findbyid(id)

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Finch » 12 янв 2013, 16:25

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

View one = getLayoutInflater().inflate(R.layout.item, linLayout, false);
TextView tv = (TextView) one.findViewById(R.id.textView1);
tv.setText("Text");
Вот как-то так.
CEO of a company R.id.team

Klafe
Сообщения: 16
Зарегистрирован: 28 дек 2012, 10:05

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Klafe » 13 янв 2013, 06:54

Я наверное не так описал ситуацию.
Есть лэйаут, у него корень - LinearLayout, а в нем 3 TextView.

getLayoutInflater().inflate(R.layout.item, linLayout, false); что вернет?

И что произойдет с LinearLayout?

view - это же пакет, а в нем есть классы: View и ViewGroup.

Нам возвращается View, я так понимаю класс а не пакет, как пакет может вернуться? (но какая именно из этих 3-х View) и куда девается ViewGroup (наш LinearLayout)?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение KamiSempai » 13 янв 2013, 11:30

Если R.layout.item - это LinearLayout то он и вернется, а внутри него будут 3 TextView, которые можно получить с помощью findViewById.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
alexvoz
Сообщения: 1
Зарегистрирован: 08 авг 2013, 01:02
Откуда: Украина
Контактная информация:

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение alexvoz » 08 авг 2013, 01:12

AndreyI писал(а):Я предлагаю просто немного дополнить урок 41.
Добавим кнопку Del в разметку item.xml
...
Спасибо, это немного прояснило ситуацию. Думаю теперь и обработка клика по самой записи (по всему item-y) можно сделать, нужно только убрать лишние getParent()
Не будет тянуть резину за хвост в долгий ящик

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Sk_games » 25 фев 2014, 19:37

Добрый верер. Делаю уроки, все было бы без проблем, иногда программы не работают, но это совсем редко. Я просто работаю в оболочке Android Studio, и иногда большие траблы. До эт ого выходило все решить. Сейчас делаю все по уроку, в коде все - что есть в уроке, икмл файлы - также. Но приложение вылетает с ошибкой. Лог:

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

02-25 11:28:41.569    1210-1210/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: example.lessons_l_inflater, PID: 1210
    java.lang.RuntimeException: Unable to start activity ComponentInfo{example.lessons_l_inflater/example.lessons_l_inflater.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
            at android.app.ActivityThread.access$700(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4998)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at example.lessons_l_inflater.MainActivity.onCreate(MainActivity.java:31)
            at android.app.Activity.performCreate(Activity.java:5243)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
            at android.app.ActivityThread.access$700(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4998)
            at java.lang.reflect.Method.invokeNative(Native Method)

Ответить