Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Александр_Алекс
4 / 1 / 1
Регистрация: 08.12.2013
Сообщений: 136
31.10.2016, 00:16     Обратиться к элементу диалогового окна #1
Доброй ночи.
Есть 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)


Буду признателен, если поможете разобраться. Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
не спать!
1803 / 1537 / 478
Регистрация: 12.05.2014
Сообщений: 5,594
Завершенные тесты: 1
31.10.2016, 00:20     Обратиться к элементу диалогового окна #2
если хочется что-то поменять в диалоге снаружи - значит архитектура хромает и все идет не так как надо
на полном серьезе
Alex_Fedor
16 / 16 / 2
Регистрация: 20.01.2015
Сообщений: 132
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);
лучше сделать переменную глобальной и определять в методе онКреате
Александр_Алекс
4 / 1 / 1
Регистрация: 08.12.2013
Сообщений: 136
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);
лучше сделать переменную глобальной и определять в методе онКреате
Дак вроде так и сделано
Alex_Fedor
16 / 16 / 2
Регистрация: 20.01.2015
Сообщений: 132
31.10.2016, 09:59     Обратиться к элементу диалогового окна #5
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Это view с другого layout'a.
Одно активит один лайоут. Вы не сможете из активити А и его лайоута А определить элементы и вывести в них информацию для лайоута Б.
Паблито
не спать!
1803 / 1537 / 478
Регистрация: 12.05.2014
Сообщений: 5,594
Завершенные тесты: 1
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");
    }
}
Александр_Алекс
4 / 1 / 1
Регистрация: 08.12.2013
Сообщений: 136
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, что я делаю не так?
Паблито
не спать!
1803 / 1537 / 478
Регистрация: 12.05.2014
Сообщений: 5,594
Завершенные тесты: 1
01.11.2016, 23:01     Обратиться к элементу диалогового окна #8
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
что я делаю не так?
вот это
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
как мне кажется, я должен объявить поле этого диалога в активити в которй я хочу вызывать этот диалог
Александр_Алекс
4 / 1 / 1
Регистрация: 08.12.2013
Сообщений: 136
01.11.2016, 23:16  [ТС]     Обратиться к элементу диалогового окна #9
Паблито, может, подсказочку?
Паблито
не спать!
1803 / 1537 / 478
Регистрация: 12.05.2014
Сообщений: 5,594
Завершенные тесты: 1
01.11.2016, 23:22     Обратиться к элементу диалогового окна #10
так не делается - неправильно лезт и и что-то пытаться записать в поля диалога из активити

ну вот на примере букингтайм - этот параметр можно ведь передать прямо в конструктор диалога, если это обычный диалог, не диалогфрагмент
Александр_Алекс
4 / 1 / 1
Регистрация: 08.12.2013
Сообщений: 136
02.11.2016, 18:56  [ТС]     Обратиться к элементу диалогового окна #11
Паблито, в туторе который я оставил выше не рекомендуется наследоваться от dialog, я наследовался от dialogfragment. Хорошо, как мне присвоить то, что я передам через конструктор, если я не могу полчить ссылку на вью? Так как getviewbyid метод класса активити
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2016, 19:29     Обратиться к элементу диалогового окна
Еще ссылки по теме:

Обратиться к фрагменту находящемуся в ViewPager Android
Android Изменить цвет диалогового окна
Как обратиться к элементу Drawer Activity? Android

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

Или воспользуйтесь поиском по форуму:
Паблито
не спать!
1803 / 1537 / 478
Регистрация: 12.05.2014
Сообщений: 5,594
Завершенные тесты: 1
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;
    }
Yandex
Объявления
02.11.2016, 19:29     Обратиться к элементу диалогового окна
Ответ Создать тему
Опции темы

Текущее время: 20:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru