0

Я использую эту библиотеку MaterialSearchView в своем приложении для реализации Gmail, подобного поисковому представлению. Библиотека предоставила детали реализации, используя Activity. Я пробовал код внутри фрагмента, внося необходимые изменения.Android, использующий Fragment вместо активности для библиотеки

Для его реализации мы делаем что-то подобное от деятельности:

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

+0

Что, собственно, не работает? – cybersam

+0

Он не запускает действие для обработки голосовых действий, внутри onVoiceClicked() –

ответ

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; 
} 
+0

Отредактирован код библиотеки, и теперь он работает. Благодаря ! –