Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
syslik
0 / 0 / 0
Регистрация: 22.05.2009
Сообщений: 38
1

Cпрятать компоненты в классе, который наследуется от DialogFragment

11.03.2015, 22:19. Просмотров 427. Ответов 4
Метки нет (Все метки)

Доброго времени суток. Столкнулся с проблемой, что не могу спрятать компоненты в классе который наследуеться от DialogFragment.

Суть програмы следующая. После старта програмы должно открываться диалоговое окно с прогресом отвечающего за соединение с сервером. Если соединение успешно - диалог закрывается, иначе прогрес прячется, а вместо него появляется кнопка Try again. Не работает как раз setVisibility компонентов диалога.
Ниже предоставлен основной листинг кода.

Главная активность, где connectionFailure не работает как нужно:
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
public class Pult extends Activity implements ICommunication {
    private String host;
    private int port;
 
    RemoteController rc;
    ProgressDialog connectionDialog;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pult);
   
        host = ...;// загрузка из конфига
        port = ...;// загрузка из конфига
 
        rc = new RemoteController(host, port);
        rc.addListener(this);
 
        connectionDialog.setRemoteController(rc);
 
        showDialog();
    }
 
    void showDialog() {
        connectionDialog = ProgressDialog.newInstance();
        connectionDialog.show(getFragmentManager(), "dialog");
    }
 
    @Override
    public void connectionFailure() {
        if(connectionDialog != null) {
            connectionDialog .connectionFault();
        }
    }
....
}
Соединение с сервером.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class RemoteController extends AsyncTask<Void, Void, Void> implements Serializable {
 
    Socket socket;
    String dstAddress, response = "";
    int dstPort;
 
    List<ICommunication> listeners = new LinkedList<ICommunication>();
 
    RemoteController(String dstAddress, int dstPort) {
        this.dstAddress = dstAddress;
        this.dstPort = dstPort;
    }
 
    public void addListener(ICommunication c) {
        listeners.add(c);
    }
 
 @Override
    protected Void doInBackground(Void... arg0) {
        try {
            socket = new Socket(dstAddress, dstPort);
            ByteArrayOutputStream byteArrayOutputStream =
                    new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
 
            int bytesRead;
            InputStream inputStream = socket.getInputStream();
 
            fireConnectionSuccess();
           
            while ((bytesRead = inputStream.read(buffer)) != -1){
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
                 .....
            }
        } catch (UnknownHostException e) {
        } catch (IOException e) {
            if(socket == null) {
                fireConnectionFailure();
            }
        } finally {
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                }
            }
        }
 
        return null;
    }
 
   private void fireConnectionSuccess() {
        for(ICommunication item: listeners) {
            item.connectionSuccess();
        }
    }
 
    private void fireConnectionFailure() {
        for(ICommunication item: listeners) {
            item.connectionFailure();
        }
}
И виновник торжества - диалоговое окно, setVisibility компонентов которого не работает.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class ProgressDialog extends DialogFragment {
    private TextView connectionTextView;
    private ProgressBar progressBar;
    private Button retryButton;
    private static RemoteController rc;
 
    public static ProgressDialog newInstance() {
        ProgressDialog dialog = new ProgressDialog();
        Bundle bundle = new Bundle();
        dialog.setArguments(bundle);
 
        return dialog;
    }
 
    public ProgressDialog() {
    }
 
    @Override
    public void onStart() {
        super.onStart();
        connectToSever();
    }
 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Dialog dialog = super.onCreateDialog(savedInstanceState);
 
        Window window = dialog.getWindow();
        window.requestFeature(Window.FEATURE_NO_TITLE);
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCanceledOnTouchOutside(false);
 
        dialog.setContentView(R.layout.progress_dialog);
 
 
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.progress_dialog, null);
        connectionTextView = (TextView) view.findViewById(R.id.connection_text_view);
        progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
        retryButton = (Button) view.findViewById(R.id.retry_button);
 
        return dialog;
    }
 
    private static void connectToSever() {
        rc.execute();
    }
 
    public static void setRemoteController(RemoteController remoteController) {
        rc = remoteController;
    }
 
    public void connectionFault() { 
        //вот сдесь ничего не работает....
        connectionTextView.setVisibility(View.INVISIBLE);
        progressBar.setVisibility(View.INVISIBLE);
        retryButton.setVisibility(View.VISIBLE);
    }
 
    private void retryConnection() {
        //и сдесь.....
        connectionTextView.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.VISIBLE);
        retryButton.setVisibility(View.INVISIBLE);
 
        connectToSever();
    }
 
    public void close() {
        this.dismiss();
    }
}
И его в"юшка.
progress_dialog.xml
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
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="30dp"
    android:background="@drawable/progress_dialog_bg">
 
    <TextView
        android:id="@+id/connection_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:text="@string/connection"
        />
    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/progress_bar"
        android:layout_below="@+id/connection_text_view"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_bar"
        android:text="@string/retry"
        android:id="@+id/retry_button"
        android:visibility="invisible"
        android:onClick="retryConnection"
        />
</RelativeLayout>
Еще почему-то очень долго ждать когда начнет выполняться doInBackground. Не понятно почему....
Буду рад за помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2015, 22:19
Ответы с готовыми решениями:

Запуск активности из класса, который не наследуется от Activity
Есть класс, который отвечает за обработку логики. Есть функция, которая при...

Написать класс Cow, который наследуется от класcа Animal
Попросили помочь найти решение, а я даже не знаю куда обратиться. Нужно...

Описать класс Cow, который наследуется от класcа Animal
Нужно написать класс Cow, который наследуется от класcа Animal. Класс Animal...

Создать user exeption класс, который наследуется от exeption
Помогите сделать следующее:сделать user exeption класс который наследуется от...

В классе OnlyData написать метод, который выводит значение переменной i и вызвать этот метод в том же классе
Я конечно понимаю, что задача оч простая, но все же. В классе OnlyData нужно...

4
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
13.03.2015, 10:14 2
syslik, честно говоря, некогда разбирать в коде, я бы помог, но некогда. Написано хорошо, по правилам.
Вместо View.INVISIBLE лучше использовать View.GONE, чтобы компонент при скрытии также освободил занимаемое место на экране.
Если что-то не работает, попробуйте ставить Log.i(,) и смотреть в logcat, что происходит. Или запустите отладчик и делайте по шагам. SetVisibility в отношении прогресса можно не использовать, если у вас есть ProgressDialog. По-моему, к нему применяется метод dismiss, который у вас есть, но не используется.
0
syslik
0 / 0 / 0
Регистрация: 22.05.2009
Сообщений: 38
13.03.2015, 10:36  [ТС] 3
Спасибо за ответ.
Суть в том, что выполнения setVisibility происходит, но ничего не происходит. Я проходил дебагером весь код и функция connectionFault вызывается. Оно просто ничего не детает, даже ошыбки нету.
0
syslik
0 / 0 / 0
Регистрация: 22.05.2009
Сообщений: 38
14.03.2015, 17:38  [ТС] 4
Методом научного тыка получилось =)
В ProgressDialog в onCreateDialog удалил поиск view при помощи LayoutInflater, а поиск елементов сделал с обектом dialog. Тоесть в методе onCreate Dialog вместо
Java
1
2
3
4
5
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.progress_dialog, null);
connectionTextView = (TextView) view.findViewById(R.id.connection_text_view);
progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
retryButton = (Button) view.findViewById(R.id.retry_button);
должно быть так:
Java
1
2
3
connectionTextView = (TextView) dialog.findViewById(R.id.connection_text_view);
progressBar = (ProgressBar) dialog.findViewById(R.id.progress_bar);
retryButton = (Button) dialog.findViewById(R.id.retry_button);
Можеш кто-то обяснить такое поведение?
Спасибо.
0
Pablito
2767 / 2198 / 744
Регистрация: 12.05.2014
Сообщений: 7,711
Завершенные тесты: 1
14.03.2015, 22:52 5
много букв
0
14.03.2015, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 22:52

Определить в классе компоненты-функции для просмотра и установки полей данных
что у меня там не правильно #include &quot;stdafx.h&quot; #include &quot;string&quot; #include...

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

Объекты в классе, который находится в DLL
Здравствуйте. Недавно, в ходе составления одной программы, наткнулся на одну...


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

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

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