Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
1

Обратиться к элементу диалогового окна

31.10.2016, 00:16. Просмотров 661. Ответов 11
Метки нет (Все метки)


Доброй ночи.
Есть activity, есть диалоговое окно, на котором расположен text view. В классе этого активити я хочу изменить текст, но метод findViewById возвращает мне null вместо ссылки на него. Я так понимаю, что я неправильно пытаюсь ее получить. Будте так добры взгялнуть на код, и объяснить мне где я напартачил

Код активити:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class TimeActivity extends AppCompatActivity {
    //view list
    ListView listTimes;
    TextView textDate;
    TextView textBookingTime; //ЭТО ТО VIEW ТЕКСТ КОТОРОГО ХОЧУ ПОМЕНЯТЬ
    //string array for my listview
    String times[] = {"08.00", "09.00", "10.00", "11.00", "12.00", "13.00", "14.00",
            "15.00", "16.00", "17.00", "18.00", "19.00", "20.00", };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time);
        //get views
        textDate = (TextView)findViewById(R.id.textDate);
        textBookingTime = (TextView)findViewById(R.id.textBookingTime); //КАК И ВО ВСЕХ УРОКАХ - ПОЛУЧАЮ ССЛЫКУ В КОНСТРУКТОРЕ  
        //get extras from intent
        String stringDate = getIntent().getStringExtra("Date");
        listTimes = (ListView)findViewById(R.id.timeListView);
        //creating list view
        ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, times);
        listTimes.setAdapter(listAdapter);
        //set date on view
        textDate.setText(stringDate);
 
        //set on item click listener
        listTimes.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                //set-up and showing booking dialog
                Dialog registerDialog = new Dialog(TimeActivity.this);
                registerDialog.setTitle("Бронь врмени"); //ТУТ ПОТОМ БУДЕТ СТРОКА ИЗ РЕСУРСОВ
                registerDialog.setContentView(R.layout.booking_layout);
                registerDialog.show();
                textBookingTime = (TextView)findViewById(R.id.textBookingTime);
                textBookingTime.setText("123"); //null pointer excepton
            }
        });
    }
}
Layout файл

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
 
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
 
        <TextView
            android:text="@string/text_booking"
            android:textSize="16sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textBooking"/>
 
        <TextView
            android:text="00:00"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/textBookingTime"/>
 
    </LinearLayout>
</LinearLayout>
Приложение крашится на последней строке - null pointer exception. Если ее закомментирвоать - все ок.
Строку кода с получением ссылки я пробовал поставить прямо перед обращением к этому вью, проблему это не решило.

Лог из консоли
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
E/AndroidRuntime: FATAL EXCEPTION: main
                  java.lang.NullPointerException
                      at com.antipov.rehearsalbasement.TimeActivity$1.onItemClick(TimeActivity.java:48)
                      at android.widget.AdapterView.performItemClick(AdapterView.java:298)
                      at android.widget.AbsListView.performItemClick(AbsListView.java:1128)
                      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2812)
                      at android.widget.AbsListView$1.run(AbsListView.java:3571)
                      at android.os.Handler.handleCallback(Handler.java:725)
                      at android.os.Handler.dispatchMessage(Handler.java:92)
                      at android.os.Looper.loop(Looper.java:153)
                      at android.app.ActivityThread.main(ActivityThread.java:5299)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:511)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
                      at dalvik.system.NativeStart.main(Native Method)


Буду признателен, если поможете разобраться. Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2016, 00:16
Ответы с готовыми решениями:

Visual C++ 6 (в самом файле обратиться к переменной диалогового окна)
Проект диалогового окна из книжки Холзнера. Добавляю Project-&gt;Add To Project-&gt;Files свой файл...

Обратиться к элементу из другого окна
Итак, на mainwindow 3 кнопки, которые переводят на один и тот же page. В зависимости от того, на...

Как присвоить переменную одного диалогового окна к переменной другого диалогового окна? (ООП)
Вот у меня есть результат вычисления и я его присваиваю переменной в первом диалоговом окне, но я...

Удержание окна с текущими введенными значениями после диалогового окна (с предупреждением)
Здравствуйте, есть маленькая задачка. Форма добавления ТС, открывается с основной формы. Нужно...

11
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
31.10.2016, 00:20 2
если хочется что-то поменять в диалоге снаружи - значит архитектура хромает и все идет не так как надо
на полном серьезе
0
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
31.10.2016, 05:56 3
Java
1
2
textDate = (TextView)findViewById(R.id.textDate);
listTimes = (ListView)findViewById(R.id.timeListView);
в лайоуте не увидел описание.
Java
1
textBookingTime = (TextView)findViewById(R.id.textBookingTime);
лучше сделать переменную глобальной и определять в методе онКреате
0
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
31.10.2016, 09:54  [ТС] 4
Цитата Сообщение от Паблито Посмотреть сообщение
значит архитектура хромает
Вполне возможно, не откажусь от материалов, которые можно почитать дабы исправить это

Добавлено через 5 минут
Цитата Сообщение от Alex_Fedor Посмотреть сообщение
textDate = (TextView)findViewById(R.id.textDate);
listTimes = (ListView)findViewById(R.id.timeListView);
в лайоуте не увидел описание
Это view с другого layout'a.

Цитата Сообщение от Alex_Fedor Посмотреть сообщение
textBookingTime = (TextView)findViewById(R.id.textBookingTime);
лучше сделать переменную глобальной и определять в методе онКреате
Дак вроде так и сделано
0
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
31.10.2016, 09:59 5
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Это view с другого layout'a.
Одно активит один лайоут. Вы не сможете из активити А и его лайоута А определить элементы и вывести в них информацию для лайоута Б.
1
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
31.10.2016, 10:01 6
я бы создал свой класс диалога, наследник от Dialog и вынес бы ВЕСЬ код, который относится к диалогу - в onCreate диалога например
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyDialod extends Dialog {
 
    private final String times[] = {"08.00", "09.00", "10.00", "11.00", "12.00", "13.00", "14.00",
            "15.00", "16.00", "17.00", "18.00", "19.00", "20.00", };
    private final TextView textBookingTime;
 
    public MyDialod(Context context) {
        super(context);
        setTitle("Бронь врмени"); //ТУТ ПОТОМ БУДЕТ СТРОКА ИЗ РЕСУРСОВ
        final View v = View.inflate(context, R.layout.booking_layout, null);
        setContentView(v);
        textBookingTime = (TextView) v.findViewById(R.id.textBookingTime);
        // тут исходя из какой-то логики и надо меня строку, а не ПОСЛЕ создания диалога
        textBookingTime.setText("123");
    }
}
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
01.11.2016, 21:37  [ТС] 7
Итак, господа, спасибо за ваши ответы, но у меня не получилось.

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

В пакадже с классами я создал отдельный, для диалогов.
Создаю там класс в который я загружаю свой лейаут, например вот такой:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.antipov.rehearsalbasement.Dialogs;
 
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TextView;
 
import com.antipov.rehearsalbasement.R;
 
/**
 * Created by Joseph K on 01.11.2016.
 */
 
public class BookingDialog extends DialogFragment {
    TextView bookingTime; //ЭТО ВЬЮ КОТОРОЕ Я ХОЧУ ИЗМЕНИТЬ
 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        //КАК Я ПОНИМАЮ, ПОЛУЧАТЬ ССЫЛКУ НА ВЬЮ МНЕ НУЖНО ТУТ ВЕДЬ ЭТО КОНСТУРКТОР
        bookingTime = (TextView)findViewById(R.id.textGoWithoutRegister); //CANNOT RESOLVE METHOD
        // Use the Builder class for convenient dialog construction
        LayoutInflater inflater = getActivity().getLayoutInflater();
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("Забронировать время");
        builder.setView(inflater.inflate(R.layout.booking_dialog, null))
                .setPositiveButton("Забронировать", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        //click action
                    }
                })
                .setNegativeButton(R.string.dismiss_button, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //dismiss action
                        BookingDialog.this.getDialog().cancel();
                    }
                });
 
        // Create the AlertDialog object and return it
        return builder.create();
    }
}


Ну а далее, как мне кажется, я должен объявить поле этого диалога в активити в которй я хочу вызывать этот диалог, потомв обработчике чего-то создать его, задать текст, и показать диалог
Java
1
2
3
4
5
6
7
8
9
...
AutorizationDialog autorizationDialog;
...
 
AutorizationDialog autorizationDialog = new AutorizationDialog();
autorizationDiaolg.bookingTime.setText("123");
autorizationDialog.show();
 
...
Но на 23 строке в методе findView я получаю ошибку CANNOT RESOLVE METHOD, что я делаю не так?
0
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
01.11.2016, 23:01 8
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
что я делаю не так?
вот это
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
как мне кажется, я должен объявить поле этого диалога в активити в которй я хочу вызывать этот диалог
0
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
01.11.2016, 23:16  [ТС] 9
Паблито, может, подсказочку?
0
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
01.11.2016, 23:22 10
так не делается - неправильно лезт и и что-то пытаться записать в поля диалога из активити

ну вот на примере букингтайм - этот параметр можно ведь передать прямо в конструктор диалога, если это обычный диалог, не диалогфрагмент
0
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
02.11.2016, 18:56  [ТС] 11
Паблито, в туторе который я оставил выше не рекомендуется наследоваться от dialog, я наследовался от dialogfragment. Хорошо, как мне присвоить то, что я передам через конструктор, если я не могу полчить ссылку на вью? Так как getviewbyid метод класса активити
0
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
02.11.2016, 19:29 12
ты что, по диагонали читаешь?
ссылку на свое вью которое в разметке диалога надо искать в диалоге (или fragmentdialog-е) но не в активити
в диалог передается текст....то есть что надо отобразить, а где и как это отобразить - решает диалог, а не активити

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

Добавлено через 25 минут

Не по теме:

я не думаю, что это "Лучший ответ", поэтому отметку снял )


у фрагмент-диалога есть метод onCreateView, он может выглядеть примерно так
Java
1
2
3
4
5
6
7
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view  = inflater.inflate(R.layout.razmetka_dialoga, container);
        TextView tv = (TextView) view.findViewById(R.id.view_kotoroe_nado_naiti);
        return view;
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2016, 19:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Создание модального диалогового окна поверх окна родителя
Не могу не где найти пример как это сделать. Нужно создать модальное окно поверх окна родителя...

Создание окна из диалогового окна
Есть необходимость создавать новое окно прямо из диалогового по происхождению некоторого события,...

Обратиться к элементу матрицы
Доброго времени суток! Помогите, пожалуйста, с такой проблемой. Не получается обратиться к...

Обратиться к элементу элемента
Как в коде обратиться к Label? &lt;Button x:Name=&quot;but&quot; HorizontalAlignment=&quot;Left&quot;...

Обратиться к элементу string ^
Привет всем! Нужно в textbox текст проверить на наличие пробелов и удалить их. Работаю в msvs 2010...

обратиться к нажатому элементу
Помогите решить задачу, вот с чем столкнулся К примеру есть &lt;ul&gt; &lt;li&gt;text1 &lt;ul&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.