Android使用Fragment而不是库的活动

时间:2016-01-06 19:22:35

标签: java android-fragments android-activity material-design

我在我的应用中使用此库MaterialSearchView来实现搜索视图等Gmail。该库使用Activity提供了实现细节。我在片段中尝试了代码,进行了必要的更改。

为了实现它,我们在活动中做了类似的事情:

MaterialSearchView searchView = (MaterialSearchView) findViewById(R.id.search_view);

但是,我正在使用片段,所以我所做的是:

searchView = (MaterialSearchView) getActivity().findViewById(R.id.search_view);

除VoiceSearch外,一切正常。该库使用以下代码实现语音搜索:

private void onVoiceClicked() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak an item name or number");    // user hint
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);    // setting recognition model, optimized for short phrases – search queries
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);    // quantity of results we want to receive
    if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(intent, REQUEST_VOICE);
    }

我该如何使这项工作?上面代码中的mContext在构造函数中设置为:

public MaterialSearchView(Context context) {
    this(context, null);
}

如何从片段中使其工作? library

的代码

1 个答案:

答案 0 :(得分:1)

mContext可能不是Activity

尝试使用此逻辑(从MediaRouteButton.getActivity()复制)以获取Activity

Activity getActivity() {
    Context context = getContext();
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) {
            return (Activity)context;
        }
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null;
}