Задачи для мобильного сотрудника (часть 1)

.

 Импорт проекта в Eclipse

Запустите Eclipse и выполните импорт проекта: File > Import… В группе Android выберите элемент «Exists Android Code Into Workspace»  нажмите Next, укажите путь к каталогу шаблона Android-проекта и нажмите Finish, новый проект будет добавлен в рабочее пространство.

Ошибок в проекте быть не должно. Если они есть, то проверьте, чтобы в настройках проекта было указано использование библиотеки ru_profi1c_fba.  Для этого выделите ваш проект в списке и в контекстом меню выберите Properties, выделите слева группу Android. Справа в группе Library нажмите кнопку Add и выберите проект ru_profi1c_fba.

Обновите проект (F5 или в контекстом меню Refresh).

Проект по умолчанию импортируется в рабочее пространство под именем MainActivity. Это не совсем удобно, можете переименовать его – в контекстном меню Refractor >Rename… и укажите новое имя, например fbaSample1Tasks, при публикации у приложения будет имя fbaSample1Tasks.apk.

Проектирование Android – приложения

1. Двойным кликом по res\layout\activity_main.xml откройте макет в редакторе UI и перетащите мышкой элемент ListView из группы Composite на форму:

Содержание activity_main.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	tools:context=".MainActivity" >

	<ListView
    	android:id="@+id/listView1"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:layout_alignParentLeft="true"
    	android:layout_alignParentTop="true" >
	</ListView>
</RelativeLayout>

2. Добавьте новый файл list_item.xml в каталог reslayout вашего проекта. Этот макет будет использоваться для отображения строк вашего списка задач. Вот содержание этого файла:

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
<?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:paddingBottom="3dp"
    android:paddingLeft="5dp"
    android:paddingTop="3dp" >
 
    <TextView
        android:id="@+id/deadline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textSize="11sp"
        android:textStyle="bold" />
 
    <TextView
        android:id="@+id/task"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/deadline"
        android:layout_toLeftOf="@+id/complete" />
 
    <ru.profi1c.engine.widget.FieldCheckBox
        android:id="@+id/complete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/task"
        android:layout_alignBottom="@+id/task"
        android:layout_alignParentRight="true"
        android:focusable="false" />
 </RelativeLayout>
<?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:paddingBottom="3dp"
    android:paddingLeft="5dp"
    android:paddingTop="3dp" >

	<TextView
    	android:id="@+id/deadline"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:layout_alignParentLeft="true"
    	android:layout_alignParentTop="true"
    	android:textAppearance="?android:attr/textAppearanceSmall"
    	android:textSize="11sp"
    	android:textStyle="bold" />

	<TextView
    	android:id="@+id/task"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:layout_alignParentLeft="true"
    	android:layout_below="@+id/deadline"
    	android:layout_toLeftOf="@+id/complete" />

	<ru.profi1c.engine.widget.FieldCheckBox
    	android:id="@+id/complete"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:layout_alignBaseline="@+id/task"
    	android:layout_alignBottom="@+id/task"
    	android:layout_alignParentRight="true"
    	android:focusable="false" />
 </RelativeLayout>

3. Откройте файл MainActivity.java и добавьте:

А) поле класса

1
private ListView list;
private ListView list;

Б) в метод onCreate, после setContentView вызов метода init()

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void onCreate(Bundle savedInstanceState) {
        …
        …
        setContentView(R.layout.activity_main);
        try {
            init();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
      	…
      	…
       	setContentView(R.layout.activity_main);
       	try {
        	init();
        } catch (SQLException e) {
        	e.printStackTrace();
        	throw new RuntimeException(e.getMessage());
        }
}

В) 2 процедуры инициализации и сохранения данных

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
private void init() throws SQLException {
 
        list = (ListView) findViewById(R.id.listView1);
 
        // создать менеджер для работы с таблицей задач
        ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class);
 
        // выбрать все задачи из локальной базы данных
        List<ExTableTasks> data = dao.select();
 
        // имена колонок, которые буду отображены в списке
        String[] from = new String[] { ExTableTasks.FIELD_NAME_DEADLINE,
                ExTableTasks.FIELD_NAME_TASK, ExTableTasks.FIELD_NAME_COMPLETE };
 
        // массив идентификаторов View которые используются для отображения
        // значений
        int[] to = new int[] { R.id.deadline, R.id.task, R.id.complete };
 
        // создать адаптер для отображения данных таблицы
        MetaArrayAdapter<ExTableTasks> adapter = new MetaArrayAdapter<ExTableTasks>(
                this, ExTableTasks.class, data, R.layout.list_item, from, to);
 
        list.setAdapter(adapter);
}
 
    @SuppressWarnings("unchecked")
    private void saveChangesToDB() {
 
        try {
                // создать менеджер для работы с таблицей задач
                ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class);
 
                MetaArrayAdapter<ExTableTasks> adapter = 
                 (MetaArrayAdapter<ExTableTasks>) list  .getAdapter();
                final int count = adapter.getCount();
 
                // Перебор все элементов в списке и сохранение изменённых в
                // локальной базе данных
                for (int i = 0; i < count; i++) {
                    ExTableTasks task = adapter.getItem(i);
                    if (task.isModified())
                        dao.update(task);
                }
        } catch (SQLException e) {
                e.printStackTrace();
        }
    }
private void init() throws SQLException {

      	list = (ListView) findViewById(R.id.listView1);

      	// создать менеджер для работы с таблицей задач
      	ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class);

      	// выбрать все задачи из локальной базы данных
      	List<ExTableTasks> data = dao.select();

      	// имена колонок, которые буду отображены в списке
      	String[] from = new String[] { ExTableTasks.FIELD_NAME_DEADLINE,
              	ExTableTasks.FIELD_NAME_TASK, ExTableTasks.FIELD_NAME_COMPLETE };

      	// массив идентификаторов View которые используются для отображения
      	// значений
      	int[] to = new int[] { R.id.deadline, R.id.task, R.id.complete };

      	// создать адаптер для отображения данных таблицы
      	MetaArrayAdapter<ExTableTasks> adapter = new MetaArrayAdapter<ExTableTasks>(
              	this, ExTableTasks.class, data, R.layout.list_item, from, to);

      	list.setAdapter(adapter);
}

	@SuppressWarnings("unchecked")
	private void saveChangesToDB() {

    	try {
            	// создать менеджер для работы с таблицей задач
            	ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class);

            	MetaArrayAdapter<ExTableTasks> adapter = 
                 (MetaArrayAdapter<ExTableTasks>) list	.getAdapter();
            	final int count = adapter.getCount();

            	// Перебор все элементов в списке и сохранение изменённых в
            	// локальной базе данных
            	for (int i = 0; i < count; i++) {
                	ExTableTasks task = adapter.getItem(i);
                	if (task.isModified())
                       	dao.update(task);
            	}
    	} catch (SQLException e) {
            	e.printStackTrace();
    	}
	}

Г) обработчик метода onStop, в котором сохраняем внесенные изменения в локальной базе на случай, если пользователь выполнил задачу, но обмен с 1С не производил

1
2
3
4
5
@Override
protected void onStop() {
        super.onStop();
        saveChangesToDB();
}
@Override
protected void onStop() {
    	super.onStop();
       	saveChangesToDB();
}

Д) в метод onOptionsItemSelected перед startExchane вызов saveChangesToDB()

1
2
 saveChangesToDB();
 startExchange(ExchangeVariant.FULL, true);
 saveChangesToDB();
 startExchange(ExchangeVariant.FULL, true);

Нажмите комбинацию клавиш Ctrl + Shift + O, Eclipse автоматически вставит необходимые директивы импорта.
Нажмите Ctrl + A чтобы выделить весь текст модуля, а затем Ctrl + Shft + F для форматирования.

Мобильное приложение готово! Полный код вы можете скачать по адресу https://xp-dev.com/svn/fba_toolkit_public/samples/fbaSample1Tasks/part01

Похожие записи: