Class 组织从 Android 片段 class 访问抽象方法

Class organization to access abstract method from Android fragment class

我不太确定我的问题陈述是什么,正如您从标题中看出的那样。我有一个扩展 Activity 的抽象 class A。 Class A 定义了一个抽象方法:

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

    protected abstract void connectBluetooth(BluetoothDevice deviceToConnect);
}

实现connectBluetooth(BluetoothDevice deviceToConnect)的class扩展Class 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);
    }
}

在 class A 我有一个 Fragment,它有自己的 class,class FragmentTab extends Fragment。此 class 包含允许用户 select 连接设备的 UI。我需要将该设备传递给 class A 或有权访问 connectBluetooth(BluetoothDevice deviceToConnect) 以便主要 activity 可以从它开始。我已经尝试使用 "wrapper" 方法,但它总是导致方法需要是静态的,这不允许我使用 connectBluetooth(BluetoothDevice deviceToConnect) 因为它是一个抽象的受保护方法。

我该怎么做才能解决这个问题?它需要另一个 class 吗?或者我只是错过了什么?

谢谢!

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

在 FragmentTab 中 class 我需要一个界面:

OnDeviceSelectedListener mDeviceListener;

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

此外,需要将其附加到 activity:

@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 调用在 class A 中实现的 OnDeviceSelected 方法。

...  mDeviceListener.onDeviceSelected(deviceToConnect);

Class 实现方法的A必须有"implements"描述:

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

最后是 class A:

中的实现
public void onDeviceSelected(BluetoothDevice deviceToConnect)
{
    connectBluetooth(deviceToConnect);
}