Исходя из фона Visual Studio / WinForms, я сталкиваюсь с проблемой того, как избежать размещения всего кода в одном большом .java-файле при разработке для Android.
В WinForms очень легко создать новый UserControl, который содержит как макет, так и код для выполнения определенной задачи. Таким образом, код не обязательно должен быть размещен в одном большом файле, но его можно «модульно» разного рода.
Как добиться того же в Android dev? Например, у меня есть файл MainActivity.java, в котором содержится весь код. Теперь я хочу сканировать устройства Bluetooth. Во время сканирования должно появляться всплывающее окно, и всякий раз, когда устройство найдено, я хочу, чтобы список (во всплывающем окне) был заполнен информацией об устройстве BT.
Итак, одним нажатием кнопки я могу сделать .startDiscovery (), но я действительно хочу, чтобы весь этот код был в другом месте, а не в моем основном файле .java. Он должен быть отдельным, включая всех слушателей событий. Ничто из этого (перехват событий и т. Д.) Не должно быть в MainActivity, все это должно быть помещено в «userControl» (и, как вы, наверное, понимаете, для этого есть много веских причин)
Каков наилучший подход для этого? Собираюсь ли я идти по этому правильному пути?
** РЕДАКТИРОВАТЬ 2011-09-05 **
Поэтому я добавил класс BluetoothTest.java для обработки всего, как описано в этом посте. Тем не менее, это не очень хорошо работает. Всплывающее окно не отображается. Я делаю это правильно?
package com.sdkexample;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
public class BluetoothTest {
private Context ct;
private View parentView;
public BluetoothTest(Context ct, View parentView)
{
this.ct = ct;
this.parentView = parentView;
}
public void start()
{
LayoutInflater mInflater = (LayoutInflater) ct.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View btView = mInflater.inflate(R.layout.popup_bluetoothsearch, null);
final ListView lv = (ListView)btView.findViewById(R.id.listViewBtDevices);
lv.setAdapter(new ArrayAdapter<String>(ct, R.id.twoLineListItem1));
PopupWindow pw = new PopupWindow(btView);
pw.showAtLocation(parentView, Gravity.CENTER, 100, 100);
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
else
{
if (!mBluetoothAdapter.isEnabled())
mBluetoothAdapter.enable();
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
ArrayAdapter aa = (ArrayAdapter)lv.getAdapter();
aa.add(device.toString());
if (device.getName()== "DPP-350")
{
// ***
// HERE I WANT TO ADD THE DEVICE TO MY LIST IN MY POPUP!
// ***
}
}
}
};
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
ct.registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
mBluetoothAdapter.startDiscovery();
}
}
}
--- РЕДАКТИРОВАТЬ ---
Эта страница описывает некоторые вещи. Моя проблема с этим постом состоит в том, что, как я описал выше, весь код содержится в «родителе»; он не содержится в форме UserControl.
«Родитель» имеет все ссылки для элементов в его всплывающем окне (он сохраняет, например, TextView как mResultText), что является еще одной нежелательной вещью. Дело в том, что всплывающее окно должно быть «независимым», чтобы его можно было использовать из любого действия. Мне нужно реализовать отдельный код для каждого всплывающего окна, которое я хочу использовать
---
Вот код, который я хочу использовать для обнаружения:
private void SearchPrinter()
{
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
else
{
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getName()== "DPP-350")
{
// ***
// HERE I WANT TO ADD THE DEVICE TO MY LIST IN MY POPUP!
// ***
}
}
}
};
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
mBluetoothAdapter.startDiscovery();
}
}