Дельта-синхронизация крипто-дисков

Существуют разные способы зашифровать "облако". Один из них - поместить в облако крипто-диск. В предыдущей статье мы писали, почему это не всегда удобно.

Смотрим плавность хода с помощью BMW Rheingold

Всем знакома ситуация, когда двигатель немного "троит", но пропусков зажигания нет...

Дельта синхронизация без облака

Ранее мы показывали разные способы синхронизации криптодиска между ПК и Android-устройством.

Облачный хостинг VDS за 2 минуты

Настоящий облачный VDS-хостинг от UltraVDS: тестируем производительность

Диалоговые окна в Android 4 и 5


© Денис Колисниченко

В этой статье мы рассмотрим диалоги следующих типов:

  • AlertDialog - диалог с кнопками;
  • DatePickerDialog - диалог выбора даты;
  • TimePickerDialog - диалог выбора времени.

1. AlertDialog

Самый частый вариант применения диалога AlertDialog — это классический диалог вопроса с кнопками Да и Нет. Вот сейчас и займемся его разработкой. При запуске наше приложение отобразит диалог, при нажатии кнопки Нет не будет произведено никаких действий — будет вызван метод cancel(). А вот действие при нажатии кнопки Да запрограммируете вы сами — но позже, когда научитесь устанавливать интернет-соединения. Взгляните, как будет выглядеть наш диалог на рис. 1.

Код приложения, отображающего этот диалог, представлен в листинге 1.

dkws.org.ua

Рис. 1. Диалог типа AlertDialog

Листинг 1. Отображение диалога типа AlertDialog

package com.sample.dialog;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.content.DialogInterface;

import android.app.AlertDialog;

public class MainActivity extends ActionBarActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

       

        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);

         // Сообщение диалога

           alt_bld.setMessage("Подключиться к dkws.org.ua ?")

           .setCancelable(false)

           .setPositiveButton("Да", new DialogInterface.OnClickListener() {

           public void onClick(DialogInterface dialog, int id) {

           // Действие для кнопки Да

           }

           })

           .setNegativeButton("Нет", new DialogInterface.OnClickListener() {

           public void onClick(DialogInterface dialog, int id) {

           //  Действие для кнопки Нет

           dialog.cancel();

           }

           });

           AlertDialog alert = alt_bld.create();

           // Title for AlertDialog

           alert.setTitle("Соединение");

           // Icon for AlertDialog

           alert.setIcon(R.drawable.ic_launcher);

           alert.show();

    }

}

Далее мы рассмотрим диалоги выбора даты и времени.

2. DatePickerDialog

Диалоги выбора даты и времени очень "многострадальные". С ними вечно все не так. Мало того, что код вызова такого диалога довольно непростой, так еще и меняется из версии в версию API. Так, для показа диалога ранее использовался метод ShowDialog(), который сейчас использовать не рекомендуется. Вместо него нужно использовать вот такую конструкцию, вовлекающую метод show():

DatePickerDialog dpg =  new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);

dpg.show();

А что, если нужно, чтобы программа была максимально совместима со всеми версиями? Тогда нужно использовать ShowDialog() и в то же время обеспечить, чтобы среда разрешила компиляцию. Для этого нужно добавить директиву @SuppressWarnings("deprecation"). Да, решение не очень хорошее, но зато работает от API 8 (2.x) до API 21 (5.0).

Далее я старался максимально упростить код. Сравните приведенный ниже код с кодом (и решением) с руководства разработчика:

https://developer.android.com/guide/topics/ui/controls/pickers.html

Само приложение тоже очень простое. Оно содержит только надпись с призывом выбрать дату (рис. 2). При щелчке по надписи открывается диалог выбора даты (рис. 3), а после выбора даты и нажатия кнопки Done выбранная пользователем дата отображается в надписи (рис. 4).

dkws.org.ua

Рис. 2. Щелкните по надписи для выбора даты

dkws.org.ua

Рис. 3. Диалог выбора даты

dkws.org.ua

Рис. 4. Выбранная дата отображена в текстовой надписи

Разметка приложения приведена в листинге 2, а Java-код приложения — в листинге 3.

Листинг 2. Разметка приложения

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

   xmlns:android="https://schemas.android.com/apk/res/android"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   android:orientation="vertical">

<TextView

   android:id="@+id/tvDate"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   android:clickable="true"

   android:onClick="onclick"

   android:text="Нажмите для выбора даты"

   android:textSize="22sp">

</TextView>

</LinearLayout>

Листинг 3. Выбор даты

package com.sample.selectdatedlg;

import android.app.Activity;

import android.app.DatePickerDialog;

import android.app.DatePickerDialog.OnDateSetListener;

import android.app.Dialog;

import android.os.Bundle;

import android.view.View;

import android.widget.DatePicker;

import android.widget.TextView;

public class MainActivity extends Activity {

 

  int DIALOG_DATE = 1;

  // Дата для инициализации (можно получить через Calendar текущую, но

  // я старался сделать код как можно проще).

  int myYear = 2014;

  int myMonth = 10;   // ноябрь, нумерация месяцев начинается с 0!

  int myDay = 03;

  TextView tvDate;

 

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tvDate = (TextView) findViewById(R.id.tvDate);

    }

// Добавил директиву, чтобы среда не "ругалась" на старый код    

    @SuppressWarnings("deprecation")

    public void onclick(View view) {

      showDialog(DIALOG_DATE);

    }

   

    @SuppressWarnings("deprecation")

    protected Dialog onCreateDialog(int id) {

      if (id == DIALOG_DATE) {

        DatePickerDialog tpd = new DatePickerDialog(this, myCallBack, myYear, myMonth, myDay);

        return tpd;

      }

      return super.onCreateDialog(id);

    }

   

    OnDateSetListener myCallBack = new OnDateSetListener() {

    public void onDateSet(DatePicker view, int year, int monthOfYear,

        int dayOfMonth) {

      myYear = year;

      // увеличиваем полученный месяц для отображения

      myMonth = monthOfYear + 1;        

      myDay = dayOfMonth;

      tvDate.setText("Дата " + myDay + "/" + myMonth + "/" + myYear);

    }

    };

}

 

3. TimePickerDialog

Сейчас напишем приложение выбора времени, но оно будет немного отличаться от предыдущего (dkws.org.ua). Вместо надписи у нас будет кнопка, вызывающая диалог выбора времени (рис. 5), а выбранное время будет отображено в качестве уведомления (рис. 6). Разметка приложения приведена в листинге 4а, а полный код приложения - в листинге 4б.

Листинг 4а. Разметка приложения

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <Button android:text="Выберите время"

    android:id="@+id/button1"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content">

</Button>

</LinearLayout>

Листинг 4б. Выбор времени (код приложения)

package com.sample.timeselect;

import android.app.Activity;

import android.os.Bundle;

import android.app.Dialog;

import android.app.TimePickerDialog;

import android.widget.Button;

import android.widget.TimePicker;

import android.widget.Toast;

import android.view.View;

public class MainActivity extends Activity {

        private Button b1;

        static final int TIME_DIALOG_ID = 0;

        @Override

         protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

                // Кнопка

                b1 = (Button) findViewById(R.id.button1);

                b1.setOnClickListener(new View.OnClickListener() {

                // Обработчик нажатия кнопки — вызываем диалог

                        @SuppressWarnings("deprecation")

                        public void onClick(View v) {

                               showDialog(TIME_DIALOG_ID);

                        }

         });

         }

       

         private TimePickerDialog.OnTimeSetListener mTimeSetListener =

         new TimePickerDialog.OnTimeSetListener() {

         // Обработчик нажатия кнопки Set диалога выбора времени (dkws.org.ua)

          public void onTimeSet(TimePicker view, int hourOfDay,

  int minute) {

        // Отображаем уведомление с выбранным пользователем временем

            Toast.makeText(MainActivity.this,

                        "Time is="+hourOfDay+":"+minute,

                        Toast.LENGTH_LONG).show();

         }

         };

         @Override

         protected Dialog onCreateDialog(int id) {

                 switch (id) {

                        case TIME_DIALOG_ID:

return new TimePickerDialog(this, mTimeSetListener, 0, 0, false);

                 }

         return null;

         }

}


dkws.org.ua

Рис. 5. Диалог выбора времени

dkws.org.ua

Рис. 6. Выбранное пользователем время