首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >设计问题:在Android中如何做"UserControls“?试图避免一个包含所有代码的大型.java文件

设计问题:在Android中如何做"UserControls“?试图避免一个包含所有代码的大型.java文件
EN

Stack Overflow用户
提问于 2011-09-03 12:35:23
回答 2查看 536关注 0票数 0

我来自Visual /WinForms背景,在为Android开发时,我面临的问题是如何避免将所有代码放在一个大型..java文件中。

在WinForms中,很容易创建一个包含布局和代码以处理特定任务的新UserControl。这样,代码就不必放在一个大文件中,而是可以进行“模块化”排序。

如何在Android中实现同样的目标?举个例子,我的MainActivity.java包含了所有的代码。现在,我想扫描蓝牙设备。一个弹出应该出现在扫描和每当一个设备被发现,我想要一个列表(在弹出)被填充的信息BT设备。

所以,只要点击按钮,我就可以做.startDiscovery(),但是我真的希望所有的代码都在其他地方,而不是在我的主.java文件中。它应该是独立的,包括所有的事件侦听器。所有这些(挂钩事件等)都不应该出现在MainActivity中,应该全部放在"userControl“中(正如您可能理解的那样,这有很多很好的理由)。

做这件事的最佳方法是什么?我要这样做吗?**编辑2011-09-05 **

因此,我添加了一个类BluetoothTest.java,用于处理本文中描述的所有内容。然而,它的工作并不是很好。弹出窗口没有显示。我做得对吗?

代码语言:javascript
代码运行次数:0
运行
复制
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),这是另一个不需要的东西。重点是弹出窗口应该是“独立的”,这样就可以从任何活动中使用它。我应该为我想要使用的每一个弹出窗口实现单独的代码。

-

下面是我想用来发现的代码:

代码语言:javascript
代码运行次数:0
运行
复制
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();
    }

}
EN

回答 2

Stack Overflow用户

发布于 2011-09-03 12:53:17

这不应该是个问题。Android是基于Java的,Java是一种面向对象的语言。您需要创建单独的类来表示BluetoothListPopUp。在该类中,可以添加与弹出相关的所有相关方法,如addToList(),您将从MainActivity.java调用这些方法

这些步骤是:

  1. 创建类BluetoothListPopUp作为PopUp (可能是PopUpWindow的扩展)
  2. 还可以在单独的xml文件中创建此弹出窗口的布局。
  3. 添加所有特定于BluetoothListPopUp的方法,包括一个添加列表的方法
  4. 在MainActivity.java中实例化这个类
  5. 在onReceive()上,调用BluetoothListPopup中的方法将设备添加到列表中。
票数 0
EN

Stack Overflow用户

发布于 2011-09-03 13:18:06

在您的活动中,创建一个class.The类构造函数的实例将执行所有所需的操作,SearchPrinter()、startDiscovery等。

更新

从另一个类中,您可以访问所有GUI元素。您可以通过传递上下文引用(getApplicationContext())或小部件本身来实现这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7293150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档