0

コードの提案によりextends ListActivity、2つのクラスから変換しています。extend ListFragment

私が知っているように、フラグメントはアクティビティに関連しているため、最初は使用getActivity()...してほとんどのメソッドを適応させる必要があります。それ以外の場合は、これを定義Activity activity_context;して使用します。

とにかく、適応できない機能がいくつかあり、助けが必要です。

1 つ目は次のとおりです。 RecentCallsListActivity extends Fragment

public class RecentCallsListActivity extends ListFragment
...

private static final class QueryHandler extends AsyncQueryHandler {
    private final WeakReference<RecentCallsListActivity> mActivity;
    ...

public QueryHandler(Context context) {
        super(context.getContentResolver());
        mActivity = new WeakReference<RecentCallsListActivity>(
                (RecentCallsListActivity) context); //GETTING THE ERROR HERE
    }

エラー:コンテキストから RecenCallsListActivity にキャストできません

public void onActivityCreated(Bundle state) {
    super.onActivityCreated(state);

    mQueryHandler = new QueryHandler(activity_context);

2 つ目は次のとおりです。 CallDetailActivity extends Fragment

public class CallDetailActivity extends ListFragment
...

public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_CALL: {
            // Make sure phone isn't already busy before starting direct call
            TelephonyManager tm = (TelephonyManager)
                    getActivity().getSystemService(Context.TELEPHONY_SERVICE);
            if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
                Intent callIntent = new Intent(Intent.ACTION_CALL,
                        Uri.fromParts("tel", mNumber, null));
                startActivity(callIntent);
                return true;
            }
        }
    }

    return super.onKeyDown(keyCode, event);  //GETTING IT HERE
}

エラー:メソッド onkeyDown(int, keyevent) は ListFragment 型に対して定義されていません

4

1 に答える 1

1
  1. QueryHandler
    実行時に、RecentCallsListActivityまたはそれから拡張されていないクラスを提供しています。これを処理する方法は、親アクティビティによって実装される API を公開するインターフェイスを定義することです。このインターフェースを実装する必要がある複数のアクティビティがあり、同じ実装を持つ場合、インターフェースを実装するスーパー アクティビティを作成すると、各アクティビティがこのスーパー クラスから拡張されます。ただし、単一のクラスがある場合は、これを行う必要はありません。
  2. onKeyDown処理 - API からわかるように、フラグメントは何も公開しませんonKeyDown。これが実装されなかった理由はいくつかありますが、このアクションをアクティビティからフラグメントに委任できるため、フラグメントが存在せずconsume、イベントを望まない場合は、アクティビティの を呼び出すことができますsuper.onKeyDown

たぶん、いくつかのコードが光を提供し、役立つでしょう。

フラグメント クラスの例:

public class QueryFragment extends Fragment {
    public static interface RecentCallsLister {
        public void someAction();
    }

    private RecentCallsLister recentCallsListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (activity instanceof RecentCallsLister) {
            this.recentCallsListener = (RecentCallsLister) activity;
        } else {
            throw new ClassCastException("Parent class does not implement RecentCallsLister");
        }
    }

    @Override
    public void onDetach() {
        this.recentCallsListener = null;
        super.onDetach();
    }

    public boolean manageOnKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_CALL) {
            // your specific code
            return true;
        }
        return false;
    }
}

親アクティビティ クラスの例:

public class QueryParentActivity extends FragmentActivity implements RecentCallsLister {
    private static final String QUERY_FRAGMENT_TAG = "QUERY_FRAGMENT_TAG";

    protected void addQueryFragment() {
        QueryFragment fragment = new QueryFragment();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.where_do_want_to_have_me, fragment, QUERY_FRAGMENT_TAG).commit();
    }

    @Override
    public void someAction() {

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (queryFragmentConsumedKeyDown(keyCode, event)) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private boolean queryFragmentConsumedKeyDown(int keyCode, KeyEvent event) {
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentByTag(QUERY_FRAGMENT_TAG);
        if (fragment != null) {
            return ((QueryFragment) fragment).manageOnKeyDown(keyCode, event);
        }
        return false;
    }
}

最初の問題の編集:コンストラクターを次
のように置き換えます。QueryHandler

public QueryHandler(Context context) {
    super(context.getContentResolver());
    mActivity = new WeakReference<RecentCallsListActivity>((RecentCallsListActivity) context);
    }

に:

public QueryHandler(Context context, RecentCallsListActivity fragmentInstance) {
    super(context.getContentResolver());
    mActivity = new WeakReference<RecentCallsListActivity>(fragmentInstance);
}

次のようにインスタンス化します。mQueryHandler = new QueryHandler(activity_context, this);

于 2013-11-07T13:12:26.780 に答える