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

フラグメントからアクティビティへのイベント コールバックを作成する必要がありました。サイモンのコメントの後、サイモンに感謝します。 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 には、「implements」の説明が必要です。

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

そして最後に、クラス A に存在する実装:

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