Вопрос дизайна: как сделать "UserControls" в Android Dev? Попытка избежать одного большого файла .java со всем кодом в нем - PullRequest
0 голосов
/ 03 сентября 2011

Исходя из фона 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();
    }

}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2011

в вашей деятельности создайте экземпляр класса. Конструктор класса выполнит все необходимые операции SearchPrinter () startDiscovery и т. Д. Я не могу придумать другой способ разделения вашего кода.

UPDATE

Из этого другого класса вы можете получить доступ ко всем элементам графического интерфейса. Вы можете сделать это, передав ссылку на контекст (getApplicationContext()) или сам виджет.

0 голосов
/ 03 сентября 2011

Это не должно быть проблемой вообще. Android основан на Java, которая по своему дизайну является языком ООП. Вам нужно создать отдельный класс для представления BluetoothListPopUp. В этом классе вы можете добавить все соответствующие методы, относящиеся к всплывающему окну, такие как addToList (), который вы будете вызывать из MainActivity.java

Шаги:

  1. Создайте класс BluetoothListPopUp в качестве всплывающего окна (возможно, расширение PopUpWindow )
  2. Также создайте макет для этого всплывающего окна в отдельном XML-файле
  3. Добавьте все методы, специфичные для BluetoothListPopUp, включая один, чтобы добавить список
  4. Создайте экземпляр этого класса в вашей MainActivity.java
  5. После onReceive () вы вызываете метод в BluetoothListPopup, чтобы добавить устройство в список.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...