2014-10-01 1 views
4

Я использую SearchView в своей деятельности. Когда пользователь вводит данные, я выполняю поисковые запросы на сервере. Я хочу указать, что происходит какая-то деятельность. Можно ли отображать счетчик прогресса в SearchView?Поместите прокрутку прогресса в SearchView?

В противном случае, как люди справляются с этим - создаем ли пользовательский родительский макет панели действий и внутри этого встроенного SearchView?

<LinearLayout orientation="horizontal"> 
    <SearchView /> 
    <ProgressBar /> 
</LinearLayout> 

Спасибо

ответ

6

Сначала создайте макет для панели прогресса. XML, как это должно сделать работу:

R.layout.loading_icon

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="25dp" 
     android:layout_height="25dp" 
     android:id="@+id/search_progress_bar" 
     android:layout_marginTop="5dp" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

Далее создайте две функции. Один, чтобы показать индикатор на вашем SearchView и других, чтобы скрыть его:

public void showProgressBar(SearchView searchView, Context context) 
{ 
    int id = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null); 
    if (searchView.findViewById(id).findViewById(R.id.search_progress_bar) != null) 
     searchView.findViewById(id).findViewById(R.id.search_progress_bar).animate().setDuration(200).alpha(1).start(); 

    else 
    { 
     View v = LayoutInflater.from(context).inflate(R.layout.loading_icon, null); 
     ((ViewGroup) searchView.findViewById(id)).addView(v, 1); 
    } 
} 
public void hideProgressBar(SearchView searchView) 
{ 
    int id = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null); 
    if (searchView.findViewById(id).findViewById(R.id.search_progress_bar) != null) 
     searchView.findViewById(id).findViewById(R.id.search_progress_bar).animate().setDuration(200).alpha(0).start(); 
} 
+0

Хорошо, я думаю, что это решение зависит от того, что Google не выпускает обновление, где «search_plate» изменен? – user3203425

+0

Да, да. Вы также можете создать свой собственный SearchView, выполнив его с помощью google sdk. –

+0

Хорошая работа. Благодаря :) –

1

Я знаю, что это не в SearchView, но это, безусловно, самым простым способом, чтобы обеспечить индикацию прогресса в ActionBar здесь http://blog.denevell.org/android-progress-spinner.html:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.activity_main); 

    // Turn it on 
    setProgressBarIndeterminateVisibility(true); 
    // And when you want to turn it off 
    setProgressBarIndeterminateVisibility(false); 
} 

Если вы действительно хотите, чтобы прогресс появился внутри SearchView, я бы предположил, что вы можете использовать FrameLayout вместо LinearLayout (или, по крайней мере, как родительский), помещая прогресс в нижней части XML (который разместит его поверх SearchView) ,

0

Если вы используете пользовательский класс, который расширяет SearchView android.support.v7.widget.SearchView, вам нужно сделать, это:

public void init(Context context){ 

     EditText searchPlate = (EditText) findViewById(android.support.v7.appcompat.R.id.search_src_text); 
     //searchPlate.setHint("Search"); 
     mSearchPlateView = findViewById(android.support.v7.appcompat.R.id.search_plate); 
     mSearchPlateView.setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); 
    } 
public void showProgressBar(Context context) { 

     if (mProgressBar != null) { 
      mProgressBar.animate() 
        .setDuration(200) 
        .alpha(1) 
        .start(); 
     } 
     else { 
      RelativeLayout relativeLayout = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.invest_progress_loading, null); 
      mProgressBar = (ProgressBar) relativeLayout.findViewById(R.id.search_progress_bar); 
      ((ViewGroup) mSearchPlateView).addView(relativeLayout, 1); 
     } 
    } 

    public void hideProgressBar() { 

     if(mProgressBar == null) 
      return; 

     mProgressBar.animate() 
        .setDuration(200) 
        .alpha(0) 
        .start(); 

    } 
Смежные вопросы