0

extends ListActivity由于extend ListFragment代码建议,我正在从 2 个类别进行转换。

据我所知,Fragment 与 Activity 有关,所以首先使用getActivity()...应该做的工作是适应大多数方法。其他时候,我已经定义Activity activity_context;并使用它。

无论如何,我有一些我无法适应的功能,我需要一些帮助。

第一个是: 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);

第二个是: 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
}

错误未定义 ListFragment 类型的方法 onkeyDown(int, keyevent)

4

1 回答 1

1
  1. QueryHandler
    在运行时,您提供的类不是 aRecentCallsListActivity或继承自它。处理这种情况的方法是定义一个接口,该接口公开应该由父活动实现的 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 回答