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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
syslik
0 / 0 / 0
Регистрация: 22.05.2009
Сообщений: 38
#1

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

11.03.2015, 22:19. Просмотров 370. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Cпрятать компоненты в классе, который наследуется от DialogFragment (Программирование Android):

Запуск активности из класса, который не наследуется от Activity - Программирование Android
Есть класс, который отвечает за обработку логики. Есть функция, которая при определенном условии должна открыть новую форму(Активити)....

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

Описать класс Cow, который наследуется от класcа Animal - PHP ООП
Нужно написать класс Cow, который наследуется от класcа Animal. Класс Animal имеет метод getName (name можно передать в конструктор). Класс...

.NET 4.x Создать user exeption класс, который наследуется от exeption - C#
Помогите сделать следующее:сделать user exeption класс который наследуется от exeption, + сделать исключение выход за границы массива) то...

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

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

4
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,943
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

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

Объекты в классе, который находится в DLL - Delphi
Здравствуйте. Недавно, в ходе составления одной программы, наткнулся на одну маленькую неучтивость. Класс-объект наследующий TObject я...

Запустить метод который находится в другом классе - C#
Здрасте Крч , нужно по нажатию кнопку запускать метод который находиться в другом классе (не в классе формы) Вот что не могу понять...

.NET 4.x Вызвать метод, который находится в классе другой формы - C# WPF
Здравствуйте, столкнулся с такой проблемой: Есть два окна, основное MainWindow и вторичное PassTurbo. С основного вызывается PassTurbo...


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

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

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