Добрый день, уважаемые коллеги!
В данной части доработаем наши мобильные приложения, описанные в 1 и 2 частях (//infostart.ru/public/613072/ //infostart.ru/public/613225/) и посмотрим на примере, как передать данные из 1С в Java приложение.
1.Открываем наш проект в Android Studio
Добавляем в activity_main.xml кнопку и два поля ввода. Должно получиться так
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnTime"
android:text="Показать время">
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnDate"
android:text="Показать дату">
</Button>
<Button
android:id="@+id/btnName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="20dp"
android:text="Ввести имя">
</Button>
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Ваше имя: ">
</TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:text="Введите ваше имя">
</TextView>
<TableLayout
android:id="@+id/tableLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:stretchColumns="1">
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Имя">
</TextView>
<EditText
android:id="@+id/etFName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp">
<requestFocus>
</requestFocus>
</EditText>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Фамилия">
</TextView>
<EditText
android:id="@+id/etLName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp">
</EditText>
</TableRow>
</TableLayout>
<Button
android:id="@+id/btnSubmit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Передать данные">
</Button>
</LinearLayout>
Создадим новый Layout в котором будем отображать переданные данные view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="TextView"
android:textSize="20sp">
</TextView>
</LinearLayout>
Создаем класс ViewActivity:
package ru.w0rm.develop.intentfilter;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class ViewActivity extends Activity {
TextView tvView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
tvView = (TextView) findViewById(R.id.tvView);
Intent intent = getIntent();
String fName = intent.getStringExtra("fname");
String lName = intent.getStringExtra("lname");
tvView.setText("Ваше имя: " + fName + " " + lName);
}
}
В коде находим TextView, затем получаем Intent и извлекаем из него String-объекты с именами fname и lname. Это те самые значения, которые мы будем передавать из 1С. Формируем строку вывода в TextView с использованием полученных данных.
Кодим класс MainActivity:
package ru.w0rm.develop.intentfilter;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnClickListener {
TextView tvName;
Button btnName;
EditText etFName;
EditText etLName;
Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnTime = (Button) findViewById(R.id.btnTime);
Button btnDate = (Button) findViewById(R.id.btnDate);
tvName = (TextView) findViewById(R.id.tvName);
btnName = (Button) findViewById(R.id.btnName);
btnName.setOnClickListener(this);
btnTime.setOnClickListener(this);
btnDate.setOnClickListener(this);
etFName = (EditText) findViewById(R.id.etFName);
etLName = (EditText) findViewById(R.id.etLName);
btnSubmit = (Button) findViewById(R.id.btnSubmit);
btnSubmit.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent;
switch(v.getId()) {
case R.id.btnTime:
intent = new Intent("ru.w0rm.intent.action.showtime");
startActivity(intent);
break;
case R.id.btnDate:
intent = new Intent("ru.w0rm.action.showdate");
startActivity(intent);
break;
case R.id.btnName:
intent = new Intent("ru.w0rm.intent.action.GetData");
startActivityForResult(intent, 1);
break;
case R.id.btnSubmit:
intent = new Intent("ru.w0rm.intent.action.PutData");
intent.putExtra("fname", etFName.getText().toString());
intent.putExtra("lname", etLName.getText().toString());
startActivityForResult(intent, 1);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data == null) {return;}
String name = data.getStringExtra("name");
tvName.setText("Ваше имя: " + name);
}
}
Здесь мы определяем поля ввода и кнопку. Кнопке присваиваем обработчик – Activity (this). Рассмотрим реализацию метода onClick. Мы создаем Intent с использованием action.
Итак, Intent создан, смотрим код дальше. Используется метод putExtra. Он имеет множество вариаций и аналогичен методу put для Map, т.е. добавляет к объекту пару. Первый параметр – это ключ(имя), второй - значение.
Мы поместили в Intent два объекта с именами: fname и lname. fname содержит значение поля etFName, lname – значение поля etLName. Остается только отправить укомплектованный Intent с помощью метода startActivity.
Не забываем в манифесте прописать наш action:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.w0rm.develop.intentfilter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ActivityTime">
<intent-filter>
<action android:name="ru.w0rm.intent.action.showtime"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<activity android:name="ActivityDate" android:label="Date basic">
<intent-filter>
<action android:name="ru.w0rm.action.showdate"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<activity android:name="NameActivity" android:label="Get data">
<intent-filter>
<action android:name="ru.w0rm.intent.action.GetData"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<activity android:name="ViewActivity" android:label="Put data">
<intent-filter>
<action android:name="ru.w0rm.intent.action.PutData"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
</application>
</manifest>
На этом реализация проекта на Java окончена. Запускаем приложение и проверяем:
2.Теперь реализуем передачу данных из 1С в приложение Java.
Открываем нашу конфигурацию 1С.
В общую форму НачальнаяФорма добавляем команду ПередатьДанные и два реквизита формы: Имя и Фамилия
Добавляем обработчик команды:
&НаКлиенте
Процедура ПоказатьВремя(Команда)
#Если МобильноеПриложениеКлиент Тогда
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="ru.w0rm.intent.action.showtime";
НовВз.Запустить(Истина);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьДату(Команда)
#Если МобильноеПриложениеКлиент Тогда
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="ru.w0rm.action.showdate";
НовВз.Запустить(Истина);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьДанные(Команда)
#Если МобильноеПриложениеКлиент Тогда
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="ru.w0rm.intent.action.GetData";
НовВз.Запустить(Истина);
Для Каждого Стр Из НовВз.ДополнительныеДанные Цикл
Сообщить(Стр.Ключ+" - "+Стр.Значение);
КонецЦикла;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПередатьДанные(Команда)
#Если МобильноеПриложениеКлиент Тогда
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие="ru.w0rm.intent.action.PutData";
НовВз.ДополнительныеДанные.Добавить("fname", Имя);
НовВз.ДополнительныеДанные.Добавить("lname", Фамилия);
НовВз.Запустить(Истина);
#КонецЕсли
КонецПроцедуры
Передача данных осуществляется через метод ДополнительныеДанные.Добавить("fname", Имя), гдк fname - это ключ параметра, а Имя - это его значение.
Запускаем мобильное приложение 1С и проверяем:
На этом у меня все.
Спасибо за внимание!