1

从标题中可以看出,我不确定我的问题陈述是什么。我有一个扩展 Activity 的抽象类 A。A 类定义了一个抽象方法:

public abstract class A extends Activity {
    ActionBar.Tab devicesTab, otherTab;
    Fragment fragmentTab = new FragmentTab();

    protected abstract void connectBluetooth(BluetoothDevice deviceToConnect);
}

实现 connectBluetooth(BluetoothDevice deviceToConnect) 的类扩展了 A 类:

public class MainActivity extends A {

    @Override
    protected void connectBluetooth(BluetoothDevice deviceToConnect)
    {
        Intent intent = new Intent(this, bActivity.class);
        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, deviceToConnect);
        this.startActivity(intent);
    }
}

AI 类内部有一个 Fragment,它有自己的类,FragmentTab 类扩展了 Fragment。此类包含允许用户选择要连接的设备的 UI。我需要将该设备传递给 A 类或有权访问 connectBluetooth(BluetoothDevice deviceToConnect) 以便主要活动可以从它开始。我尝试使用“包装器”方法,但它总是导致方法需要是静态的,这不允许我使用 connectBluetooth(BluetoothDevice deviceToConnect) 因为它是一个抽象的受保护方法。

我能做些什么来解决这个问题?它需要另一个类吗?还是我只是错过了什么?

谢谢!

4

1 回答 1

3

我需要从 Fragment 为我的活动创建一个事件回调。在西蒙的评论之后,谢谢西蒙,我研究了 Fragments、接口和回调。这解决了我的问题,但我同意设计可以重新设计。

在 FragmentTab 类中,我需要一个接口:

OnDeviceSelectedListener mDeviceListener;

public interface OnDeviceSelectedListener
{
    public void onDeviceSelected(BluetoothDevice deviceToConnect);
}

此外,需要将其附加到活动:

@Override
public void onAttach(Activity activity)
{
    super.onAttach(activity);

    try
    {
        mDeviceListener = (OnDeviceSelectedListener)activity;
    }
    catch (ClassCastException e)
    {
        throw new ClassCastException(activity.toString() + "must implement OnDeviceSelectedListner");
    }
}

之后 OnItemClickListener 调用在类 A 中实现的 OnDeviceSelected 方法。

...  mDeviceListener.onDeviceSelected(deviceToConnect);

实现该方法的 A 类必须具有“实现”描述:

public abstract class A extends Activity implements FragmentTab.OnDeviceSelectedListener
{   ...
} 

最后是 A 类中的实现:

public void onDeviceSelected(BluetoothDevice deviceToConnect)
{
    connectBluetooth(deviceToConnect);
}
于 2015-02-17T20:47:19.210 回答