Parçalarla Android arama


161

Birisi bir öğretici veya standart Android arama arayüzününFragment s ile nasıl uygulanacağının bir örneğini biliyor mu ? Başka bir deyişle, SearchManagerbir Fragment içinde a ile standart bir arama yapmak mümkün müdür ?


@Blackbelt'e kim bonus verir? Raghav aradığım cevabı verdi. ama Alex LockWood da sorunuzun ilk kısmına cevap verdi.
Snicolas

LockWood'un cevabını kabul ediyorum. Ödülünü istediğiniz gibi
ödüllendirin

4
Biz böyle çeşitli doğru cevaplar ve geçici çözümler almak kadar sona erdi sevindim! :)
Alex Lockwood

Biri bana bu sorunun cevabını verebilir mi? Burada sıkışıp kaldım stackoverflow.com/questions/10600660/…
Çaylak

1
Eylem çubuğuna SearchView ekledikten sonra parça içinde kalmak için bu tekniği kullanıyorum: stackoverflow.com/a/6939735/1068167 . Başvurum henüz yapılmadı ama umarım işe yarar.
span

Yanıtlar:


91

Kısacası yapamazsınız. A içinde bir arama arayüzü oluşturmanın birkaç nedeni vardır Fragment.

  1. Aranabilir bir arayüz oluştururken, Android bildiriminizde varsayılan bir "aranabilir etkinlik" belirtmelisiniz. Bildiğim gibi, Fragmentbir ebeveyn olmadan var olamaz Activityve bu nedenle bu ayrım mümkün değildir.

  2. Zaten # 1'i çözdüyseniz, bu soruyu işin üstesinden gelebilecek sihirli bir "hack" olması umuduyla sorduğunuzu varsayıyorum. Ancak, belgeler,

    Kullanıcı arama iletişim kutusunda veya widget'ta bir arama gerçekleştirdiğinde, sistem aranabilir etkinliğinizi başlatır ve ACTION_SEARCH eylemiyle bir Hedefte arama sorgusunu sunar. Aranabilir etkinliğiniz sorguyu niyetin QUERY extra öğesinden alır, ardından verilerinizi arar ve sonuçları sunar.

    Arama sonuçlarını sağlamaktan sorumludur yatan, dahili sistem bir beklediğini Activitydeğil, bir Fragment; bu nedenle, temel sistemdeActivity değişiklik yapılmasını gerektireceğinden, a'dan tamamen bağımsız bir arama arayüzü uygulamak mümkün değildir . SearchableInfoBana inanmıyorsanız , sınıfın kaynak koduna bakın :).

Bununla birlikte, tarif ettiğinize benzer bir şey elde etmek çok zor görünmüyor. Örneğin, aranabilir Etkinliğinizi, android.intent.action.SEARCHamacı kabul etmesi ve ( ListViewörneğin , sonuçları hemen görüntülemek yerine ) arama sorgusunu kendi URL'lerinize iletmesi için uygulamayı düşünebilirsiniz Fragment. Örneğin, aşağıdaki aranabilir Etkinliği göz önünde bulundurun:

public class SearchableActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Intent.ACTION_SEARCH.equals(getIntent().getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    /**
     * Performs a search and passes the results to the container
     * Activity that holds your Fragments.
     */
    public void doMySearch(String query) {
        // TODO: implement this
    }
}

Bir arama isteği yapıldığında, sistem aranabilir etkinliğinizi başlatır, sorguyu gerçekleştirir ve sonuçları bir kapsayıcı etkinliğine iletir (uygulamanıza bağlı olarak doMySearch). Kapsayıcı Etkinliği daha sonra bu sonuçları Fragment, sonuçların görüntüleneceği içerilen aranabilirliğe geçirecektir. Uygulama, muhtemelen umduğunuzdan biraz daha fazla iş gerektirir, ancak eminim daha modüler hale getirmenin yolları vardır ve bu yapabileceğiniz en iyi şey gibi görünebilir.

ps Bu yaklaşımı kullanırsanız, Backstack'e hangi Etkinliklerin eklendiğine / kaldırıldığına özellikle dikkat etmeniz gerekebilir. Bunun nasıl yapılabileceği hakkında daha fazla bilgi için bu gönderiye bakın .

pps Ayrıca standart arama arayüzünü tamamen unutabilir ve aşağıdaki Raghav'un ​​gönderisindeFragment açıklandığı gibi basit bir arama gerçekleştirebilirsiniz .


@Alex, Parçalar kullanarak standart Android arama arayüzünü uygulamak kesinlikle mümkündür. Ama çok iş gerektiriyor ... :-)
Vinay S Shenoy

Evet @VinaySShenoy, sana bütününü yeniden düzenlemesini olurdu demek SearchManageriçin Fragmentdoğru s? (veya bunun gibi bir şey)
Alex Lockwood

1
Arama Sonuçlarını yayınlamak için, önerdiğinize benzer bir şey uyguladım ve görünürlüğü doğru parçaya dağıtan Etkinliğe niyet sunuyorum. En zor kısım, önerileri görüntülememe, arama gönderme ve önerileri tıklatma işlemlerini yapmama izin vermek için parça yükündeki Öneriler Tablosunu doğru verilerle yeniden doldurmaktı. Ama şimdi gelecekteki uygulamalar için güzel bir çerçeve var .. :-)
Vinay S Shenoy

Bunu daha iyi bir cevap olarak buldum: stackoverflow.com/questions/6938952/… Bu, Parçalar içinden "arama" yapılmasına izin verecektir. Doğru, Google tarafından sağlanan resmi arama mekanizması değil, ancak iyi çalışıyor.
Kyle Falconer

76

Parçalar kullanarak bir şeyi aramak için örnek. Umarım yardımcı olur ve aradığınız şey budur:

public class LoaderCursor extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FragmentManager fm = getFragmentManager();

        // Create the list fragment and add it as our sole content.
        if (fm.findFragmentById(android.R.id.content) == null) {
            CursorLoaderListFragment list = new CursorLoaderListFragment();
            fm.beginTransaction().add(android.R.id.content, list).commit();
        }
    }

    public static class CursorLoaderListFragment extends ListFragment
            implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {

        // This is the Adapter being used to display the list's data.
        SimpleCursorAdapter mAdapter;

        // If non-null, this is the current filter the user has provided.
        String mCurFilter;

        @Override public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            // Give some text to display if there is no data.  In a real
            // application this would come from a resource.
            setEmptyText("No phone numbers");

            // We have a menu item to show in action bar.
            setHasOptionsMenu(true);

            // Create an empty adapter we will use to display the loaded data.
            mAdapter = new SimpleCursorAdapter(getActivity(),
                    android.R.layout.simple_list_item_2, null,
                    new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
                    new int[] { android.R.id.text1, android.R.id.text2 }, 0);
            setListAdapter(mAdapter);

            // Start out with a progress indicator.
            setListShown(false);

            // Prepare the loader.  Either re-connect with an existing one,
            // or start a new one.
            getLoaderManager().initLoader(0, null, this);
        }

        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            // Place an action bar item for searching.
            MenuItem item = menu.add("Search");
            item.setIcon(android.R.drawable.ic_menu_search);
            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            SearchView sv = new SearchView(getActivity());
            sv.setOnQueryTextListener(this);
            item.setActionView(sv);
        }

        public boolean onQueryTextChange(String newText) {
            // Called when the action bar search text has changed.  Update
            // the search filter, and restart the loader to do a new query
            // with this filter.
            mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
            getLoaderManager().restartLoader(0, null, this);
            return true;
        }

        @Override public boolean onQueryTextSubmit(String query) {
            // Don't care about this.
            return true;
        }

        @Override public void onListItemClick(ListView l, View v, int position, long id) {
            // Insert desired behavior here.
            Log.i("FragmentComplexList", "Item clicked: " + id);
        }

        // These are the Contacts rows that we will retrieve.
        static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
            Contacts._ID,
            Contacts.DISPLAY_NAME,
            Contacts.CONTACT_STATUS,
            Contacts.CONTACT_PRESENCE,
            Contacts.PHOTO_ID,
            Contacts.LOOKUP_KEY,
        };

        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            // This is called when a new Loader needs to be created.  This
            // sample only has one Loader, so we don't care about the ID.
            // First, pick the base URI to use depending on whether we are
            // currently filtering.
            Uri baseUri;
            if (mCurFilter != null) {
                baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
                        Uri.encode(mCurFilter));
            } else {
                baseUri = Contacts.CONTENT_URI;
            }

            // Now create and return a CursorLoader that will take care of
            // creating a Cursor for the data being displayed.
            String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
                    + Contacts.DISPLAY_NAME + " != '' ))";
            return new CursorLoader(getActivity(), baseUri,
                    CONTACTS_SUMMARY_PROJECTION, select, null,
                    Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
        }

        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            // Swap the new cursor in.  (The framework will take care of closing the
            // old cursor once we return.)
            mAdapter.swapCursor(data);

            // The list should now be shown.
            if (isResumed()) {
                setListShown(true);
            } else {
                setListShownNoAnimation(true);
            }
        }

        public void onLoaderReset(Loader<Cursor> loader) {
            // This is called when the last Cursor provided to onLoadFinished()
            // above is about to be closed.  We need to make sure we are no
            // longer using it.
            mAdapter.swapCursor(null);
        }
    }
}

OP "standart arama arayüzü" istedi, ama bu Fragmentşikayetçi olmazdı bu yüzden içinde basit bir "arama" elde eder . Tebrikler! : P
Alex Lockwood

30
Bir dahaki sefere kaynaklarınızı belirtmek isteyebilirsiniz .
Adrian Monk

Geliştiricinin sitesinde arama arayüzü oluşturma konusuna bakın . OP, dokümanlarda açıklandığı gibi standart Android aramasıyla çalışan bir "aranabilir Parça" oluşturmanın mümkün olup olmadığını sordu.
Alex Lockwood

Bazı tuzaklar: 1-Özelleştirilmiş bir arama simgesi kullanmak işe yaramaz. 2-SearchView, içeriği devre dışı bırakmak, geri işlemek
vb.Gibi

Benim durumumda onQueryTextChangeyöntem çağrılmıyor.
Shajeel Afzal

57

Standart ActionBar SearchView ActionView API'sini kullanarak bir parçada arama yapmak oldukça mümkündür. Bu, AppCompat destek sınıfları v7 kullanılarak Android 2.1'e (API düzey 7) geri dönecektir.

Parçanızda:

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){
    inflater.inflate(R.menu.search, menu);
    MenuItem item = menu.findItem(R.id.action_search);
    SearchView sv = new SearchView(((YourActivity) getActivity()).getSupportActionBar().getThemedContext());
    MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    MenuItemCompat.setActionView(item, sv);
    sv.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            System.out.println("search query submit");
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            System.out.println("tap");
            return false;
        }
    });
}

Menü XML'inizde

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    android:title="Search Waste Items"
    android:showAsAction="ifRoom|collapseActionView"
    nz.govt.app:actionViewClass="android.support.v7.widget.SearchView"
    nz.govt.app:showAsAction="ifRoom|collapseActionView" />

Bu yeni ActionBarActivity appcompat v7 ile harika çalışıyor, teşekkürler
Pelanes

1
kabul edilen cevabı okurken umudumu kaybettim ... diğer cevaplar karmaşık, cevabınızı okudum !!! Çok basit! thats it ... çok teşekkür ederim
MBH

2
Bence onActivityCreated içine setHasOptionsMenu (true) eklememiz gerekiyor. @MBH tarafından tespit edildiği gibi.
Raymond Lukanta

2
@GowthamanM AppCompat daha sonraki API'larda kullanımdan kaldırılabiliyorsa MenuItem.SHOW_AS_ACTION .... 'ı kullanın
David

1
Hey @GowthamanM, şöyle kullanın: item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
Rod Lima

15

AppCompat destek sınıflarını kullanma v7. Sadece bir şeyler ekleyerek @ David dan 'ın çözümü @Rookie çözümü burada benim parçası kodu basit bir şekilde düzgün çalışması için:

Parçam :

public class MyFragment extends Fragment implements SearchView.OnQueryTextListener {

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // What i have added is this
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {

        //inflater.inflate(R.menu.main, menu); // removed to not double the menu items
        MenuItem item = menu.findItem(R.id.action_search);
        SearchView sv = new SearchView(((MainActivity) getActivity()).getSupportActionBar().getThemedContext());
        MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
        MenuItemCompat.setActionView(item, sv);
        sv.setOnQueryTextListener(this);
        sv.setIconifiedByDefault(false);
        sv.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Utils.LogDebug("Clicked: ");
            }
        });

        MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                // Do something when collapsed
                Utils.LogDebug("Closed: ");
                return true;  // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                // Do something when expanded
                Utils.LogDebug("Openeed: ");
                return true;  // Return true to expand action view
            }
        });

        super.onCreateOptionsMenu(menu,inflater);
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        Utils.LogDebug("Submitted: "+query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        Utils.LogDebug("Changed: "+newText);
        return false;
    }
}

Eklediğim onActivityCreateduğramadan kuzen, setHasOptionsMenu(true);bu fragman menü ile etkileşim ihtiyacı olduğunu bilmeyecektir sistemi.

daha sonra inflater.inflate(R.menu.main, menu);Etkinlik bir menüyü şişirdiğinden menü öğelerini ikiye katladığından satırı kaldırdım , sonra Fragment başka bir menüyü şişirdi

@David ve @Rookie sayesinde


7

İle çalışırken Fragmentshala Activitykontrol etmek ve atamak için bir kullanmanız gerekir Fragments. Bu Activity, önceki gibi arama işlevselliğine sahip olabilir.

Son zamanlarda 'normal' Activitytabanlı bir uygulamadan, temelli bir uygulamaya geçtim Fragmentve arama işlevselliği benim için aynı şekilde çalıştı.

Üzerinde çalışmayı denedin ve başarılı olamadın mı? Eğer öyleyse sorunuzda biraz daha ayrıntı verin.

DÜZENLE:

Eğer bir parça spesifik arama sahip olmak istiyorsanız, her şeye sahip senin Fragmentsbir arayüz uzatmak MyFragmentbir ile startSearchyöntemle, ve var Activity'nın startSearchyöntem çağrısı geçerli veridiliminin startSearchyöntemi.


Gereksinim, android aramasının etkinliğe değil, belirli bir parçaya bağlı olmasıydı. Yani hayır denemedim.
Blackbelt

Henüz denemedim, ama tam olarak aradığım şey gibi görünüyor. Her biri ilgisiz arama özellikleri içeren parçaları ile bir navigasyon çekmece var. Android arama sistemini tamamen atlamak istemiyorum, bu yüzden böyle bir şeye ihtiyacım vardı.
Bassinator

5

Bunu başardığımı düşünüyorum: aslında parçaları kullanabilir ve bir eylem çubuğuna bir arama simgesi ekleyebilirsiniz, böylece parçaların içinde bir arama yapılabilir. Hile, bir eylem çubuğu, bir eylem görünümü, bir dinleyici, bir yükleyici ve elbette bir adaptör kullanmaktır.

Android platform arama mekanizmasını tamamen atlamasına rağmen bu oldukça iyi çalışıyor (ancak @Alex Lockwood'un neyi tanımladığını bulmak ve aramayı parçalara geçirmek için bazı çalışmalar ile tamamlanabilir). Bir etkinlik durumunda beklenen bir amaca tepki vermez, ancak işe yarar: kullanıcılar parçaların içinde arama yapabilir.

İşte kod:

SearchInFragmentActivity

package com.sof.test.searchfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.ActionBar.TabListener;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.sof.test.searchfragment.SearchFragment;
import com.sof.test.R;


public class SearchInFragmentActivity extends SherlockFragmentActivity implements TabListener {

    private SearchFragment tab1 = new SearchFragment();
    private SearchFragment tab2 = new SearchFragment();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.search_in_fragments );

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        createTab( R.string.tab1, R.drawable.ic_menu_search );
        createTab( R.string.tab2, R.drawable.ic_menu_search );
        getSupportActionBar().setSelectedNavigationItem( 0 );
        invalidateOptionsMenu();
    }

    private void createTab(int tabNameResId, int tabIconResId) {
        ActionBar.Tab tab = getSupportActionBar().newTab();
        tab.setText( tabNameResId );
        tab.setTabListener(this);
        getSupportActionBar().addTab(tab);
    }// met

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if( ft == null ) {
            return;
        }//if
        View fragmentSlot = findViewById( R.id.fragment );
        Fragment newFragment = null;
        if( fragmentSlot != null ) {
            newFragment = (tab.getPosition() == 0) ? tab1 : tab2;
            ft.replace(R.id.fragment, newFragment );
            ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        }//if
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

}//class

Parça sınıfı SearchFragment (yukarıdaki etkinliğin içinde 2 örnek kullanıyorum).

package com.sof.test.searchfragment;


import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SearchView;
import android.widget.TextView;

import com.sof.test.R;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;

public class SearchFragment extends SherlockListFragment {

    private StringLoader loader = null;
    private StringAdapter adapter = null;
    private List<String> listData = new ArrayList<String>();
    private String query;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        createListData();

        loader = new StringLoader( getActivity(), this );
        adapter = new StringAdapter(listData);
        setListAdapter(adapter);

        getLoaderManager().initLoader(0, null,  new LoaderCallBacks() );
        loader.forceLoad();
        setHasOptionsMenu( true );
        return view;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater ) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate( R.menu.menu_search, menu);
        System.out.println( "inflating menu");

        final SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                showFilteredItems( newText );
                return true;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                return true;
            }
        };

        searchView.setOnQueryTextListener(queryTextListener);

        return;
    }//met

    private void showFilteredItems( String query ) {
        this.query = query;
        loader.onContentChanged();
    }

    private void createListData() {
        for( int i = 0; i < 100 ; i ++ ) {
          listData.add( "String "+ i ); 
        }
    }

    public List<String> getData() {
        List<String> listFilteredData = new ArrayList<String>();
        for( String string : listData ) {
            if( query == null || string.contains( query ) ) {
                listFilteredData.add( string );
            }
        }
        return listFilteredData;
    }//met

    private class LoaderCallBacks implements LoaderCallbacks< List<String>> {
        @Override
        public void onLoadFinished(Loader<List<String>> loader,
                List<String> listData) {
            adapter.setListData( listData );
        }// met

        @Override
        public void onLoaderReset(Loader<List<String>> listData) {
            adapter.setListData( new ArrayList<String>() );
        }// met

        @Override
        public Loader<List<String>> onCreateLoader(int arg0,
                Bundle arg1) {
            return loader;
        }// met
    }//class

    private class StringAdapter extends ArrayAdapter< String > {

        private List<String> listDataToDisplay = new ArrayList<String>();
        private LayoutInflater mInflater;

        public StringAdapter( List<String> listData ) {
            super( getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, listData );
            listDataToDisplay = listData;
            mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }//cons

        private void setListData( List<String> newListData ) {
            this.listDataToDisplay.clear();
            this.listDataToDisplay.addAll( newListData );
            notifyDataSetChanged();
        }//met

          /**
         * Populate new items in the list.
         */
        @Override public View getView(int position, View convertView, ViewGroup parent) {
            View view;

            if (convertView == null) {
                view = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
            } else {
                view = convertView;
            }

            ((TextView)view.findViewById( android.R.id.text1)).setText( listDataToDisplay.get( position ) );

            return view;
        }
    }//inner class
}//class

class StringLoader extends AsyncTaskLoader<List<String>> {

    SearchFragment fragment = null;

    public StringLoader(Context context, SearchFragment fragment) {
        super(context);
        this.fragment = fragment;
    }// cons

    @Override
    public List<String> loadInBackground() {
        return fragment.getData();
    }// met
}// class

Res / menu / menu_search.xml arama parçalarının menüsü için xml dosyası:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal" >
    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

Ve xml düzen dosyası res / layout / search_in_fragments.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal" >
    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

Ayrıca Jake Wharton'un SearchViewkarmaşıklığı nedeniyle ActionBarSherlock kütüphanesi için uygulamaya karar vermediğini belirtmek isterim ( yorumuna buradan bakın ). Gördüğünüz gibi (ve cevabımda da açıkladığım gibi), Android'in arama uygulaması önemsiz olmaktan başka bir şey ... temel sistemde kökleşmiş ve bu da 3. taraf kütüphanelerinin bile yazılmasını zorlaştırıyor (ve bu bir şey söylüyor. .. Jake Wharton, 3. parti kütüphanelerin Chuck Norris'i gibi!: D).
Alex Lockwood

SearchView.javaBuradaki kaynak koduna bir göz atın .
Alex Lockwood

2
Alex, Jake Wharton fikrini değiştirdi gibi görünüyor: twitter.com/JakeWharton/status/221169921235755009
Jose_GD

Bu xml dosyalarının ikisi de aynı mı?
Clocker

@Clocker, oldukları gibi görünüyor. Dürüst olmak gerekirse, 2 yıl sonra söyleyemem
Snicolas

5

Kullanın ActionBarve SearchView. Etkinlikle herhangi bir bağlantı kurmadan arama yapabileceksiniz. Sadece OnQueryTextListenerSearchView için bir ayarlayın .

MenuItem item = menu.add("Search");
SearchView sv = new SearchView(getActionBar().getThemedContext());
item.setActionView(sv);
item.setIcon(R.drawable.ic_search);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
        | MenuItem.SHOW_AS_ACTION_IF_ROOM);
sv.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        //...
        return false;
    }
    @Override
    public boolean onQueryTextChange(String newText) {
        //...
        return false;
    }
});

Özel arama hakkında daha fazla bilgi için bu gönderiye bakın .


3

diğerleri çözüm ..... bunu sevmiyorum. Bu benim için daha kolay.Ama bu benim fikrim.

public interface SearchImpl {
    public void searchQuery(String val);
}

fragman

public class MyFragment extends Fragment implements SearchImpl {
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_almanca, container, false);
        return view;
    }

    @Override
    public void searchQuery(String val) {
        Log.e("getted", val);
    }
}

Acitivty

 @Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Log.e("setted", "" + query);
            try {
                MyFragment myFGM=new MyFragment();
                myFGM.searchQuery(query);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

1

A Fragment, a'nın dışında var Activityolamaz ve a Fragment, bir android.intent.action.SEARCHveya başka biriyle bağlantılı olamaz intent-filter.

Yani, ' Activityi sarmak için kullanmadan Fragment, sorduğunuz şey mümkün değildir.


1

Bir ViewPager içine Parçalar durumunda, ben bir arama çubuğu vermek istiyorum parçası üzerinde değilim zaman arama düğmesini engelleyerek yapabilirdi. Faaliyetin içine:

@Override
public boolean onSearchRequested() {

    if (mPager.getCurrentItem() == mAdapter.getPosition(FragmentType.VIDEO))
        return super.onSearchRequested();
    else
        return false;
}

Ve fiziksel arama düğmesi yoksa, bu kodu tetikleyen parçaya bir eylem öğesi ekledim:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == R.id.search_item) {

        return getSherlockActivity().onSearchRequested();
    }
    return super.onOptionsItemSelected(item);
}

1

i etrafında bir iş buldum :) BaseActivity bu yöntemi (startActivity (Intent)) geçersiz kılabilir ve sonra eylem ACTION_SEARCH olup olmadığını kontrol edin sonra özel işinizi yapın: D

@Override
    public void startActivity(Intent intent) {
        try {
            if (intent.getAction().equals(Intent.ACTION_SEARCH))
                toast("hello");
        } catch (Exception e) {

        }
    }

0

Evet mümkün,

lütfen Faaliyetinizdeki Arama görünümünü uygular, Etkinlik'teki 'onQueryTextChange' de aramayı parça halinde dinler, 'onQueryTextChange' içindeki parça görünürlüğünü kontrol edebilirsiniz, eğer görünürse parça için arama yönteminizi çağırabilirsiniz, kodumda mükemmel çalışır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.