টুকরা সহ অ্যান্ড্রয়েড অনুসন্ধান


161

কেউ টিউটোরিয়াল বা এর সাথে স্ট্যান্ডার্ড অ্যান্ড্রয়েড অনুসন্ধান ইন্টারফেসটি কীভাবে প্রয়োগ করতে পারে তার একটি উদাহরণ জানেন Fragment? অন্য কথায়, SearchManagerকোনও খণ্ডে কোনও স্ট্যান্ডার্ড অনুসন্ধান করা কি সম্ভব ?


@ ব্ল্যাকবেল্ট কে আপনি বোনাস দেবেন? রাঘব আমি যে উত্তরটি খুঁজছিলাম তার উত্তর দিয়েছিল। তবে অ্যালেক্স লকউড আপনার প্রশ্নের প্রথম অংশের উত্তরও দিয়েছিল।
Snicolas

আমি লকউডের উত্তর গ্রহণ করি। আপনার পছন্দ মতো
অনুগ্রহটি

4
আমি খুশি হলাম আমরা এরকম বিভিন্ন ধরণের সঠিক উত্তর এবং কার্যক্রম পেয়েছি! :)
অ্যালেক্স লকউড

কেউ কি আমাকে এই প্রশ্নের উত্তর দিতে পারবেন ..? আমি এখানে আটকে আছি stackoverflow.com/questions/10600660/…
রুকি

1
আমি এই কৌশল ব্যবহার করছি actionbar করার SearchView যোগ করার পরে টুকরা মধ্যে রাখতে হবে: stackoverflow.com/a/6939735/1068167 । আমার আবেদনটি এখনও করা হয়নি তবে আশা করি এটি কার্যকর হবে।
স্প্যান করুন

উত্তর:


91

সংক্ষেপে, আপনি পারবেন না। এর মধ্যে বেশ কয়েকটি কারণ রয়েছে যেগুলির মধ্যে একটি অনুসন্ধান ইন্টারফেস তৈরি করা Fragmentসম্ভব নয়।

  1. অনুসন্ধানযোগ্য ইন্টারফেস তৈরি করার সময় আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে আপনাকে অবশ্যই একটি ডিফল্ট "অনুসন্ধানযোগ্য ক্রিয়াকলাপ" নির্দিষ্ট করতে হবে। যেহেতু আমি নিশ্চিত যে আপনি জানেন, Fragmentপিতামাতাকে ছাড়া কোনওটির অস্তিত্ব থাকতে পারে না Activityএবং এইভাবে এই বিচ্ছেদ সম্ভব নয়।

  2. আপনি যদি ইতিমধ্যে # 1 বের করে ফেলেছেন তবে আমি ধরে নিচ্ছি যে আপনি এই প্রশ্নটি এই আশায় জিজ্ঞাসা করেছেন যে সেখানে কিছু জাদুকরী "হ্যাক" আছে যা কাজটি সম্পন্ন করতে পারে। তবে ডকুমেন্টেশনে বলা হয়েছে যে,

    ব্যবহারকারী যখন অনুসন্ধান ডায়ালগ বা উইজেটে কোনও অনুসন্ধান চালায়, সিস্টেমটি আপনার অনুসন্ধানযোগ্য ক্রিয়াকলাপ শুরু করে এবং এটি সন্ধান অনুসন্ধানটি ACTION_SEARCH ক্রিয়াকলাপ সহ একটি উদ্দেশ্যতে সরবরাহ করে। আপনার অনুসন্ধানযোগ্য ক্রিয়াকলাপটি উদ্দেশ্যটির QUERY অতিরিক্ত থেকে কোয়েরিটি পুনরুদ্ধার করে, তারপরে আপনার ডেটা অনুসন্ধান করে এবং ফলাফল উপস্থাপন করে।

    অন্তর্নিহিত, অভ্যন্তরীণ সিস্টেম যা অনুসন্ধান ফলাফল সরবরাহের জন্য দায়বদ্ধ Activityতা একটি নয়, একটি প্রত্যাশা করে Fragment; সুতরাং, কোনও অনুসন্ধানের ইন্টারফেস প্রয়োগ করা যা সম্পূর্ণরূপে স্বতন্ত্র Activityএবং এটি অন্তর্নিহিত সিস্টেমে পরিবর্তনের প্রয়োজন হয়SearchableInfoআপনি যদি বিশ্বাস না করেন তবে ক্লাসের উত্স কোডটি দেখুন :)

এটি বলা হচ্ছে, আপনি যা বর্ণনা করছেন তার অনুরূপ কিছু অর্জন করা খুব কঠিন হবে বলে মনে হয় না। উদাহরণস্বরূপ, আপনি আপনার অনুসন্ধানযোগ্য-ক্রিয়াকলাপটি বাস্তবায়নের বিষয়ে বিবেচনা করতে পারেন যাতে এটি android.intent.action.SEARCHঅভিপ্রায়টি গ্রহণ করে এবং ( ListViewউদাহরণস্বরূপ একটি ফলাফলের সাথে সাথে ফলাফল প্রকাশের পরিবর্তে ) অনুসন্ধানের অনুসন্ধানটি আপনার কাছে পৌঁছে দেয় Fragment। উদাহরণস্বরূপ, নিম্নলিখিত অনুসন্ধানযোগ্য ক্রিয়াকলাপটি বিবেচনা করুন:

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
    }
}

যখন অনুসন্ধান-অনুরোধ করা হয়, তখন সিস্টেমটি আপনার অনুসন্ধানযোগ্য ক্রিয়াকলাপটি চালু করবে, ক্যোয়ারীটি সম্পাদন করবে এবং ফলাফলগুলি কিছু ধারক ক্রিয়াকলাপে সরবরাহ করবে (আপনার প্রয়োগের ভিত্তিতে doMySearch)। ধারক ক্রিয়াকলাপটি এরপরে সন্ধানযোগ্য থাকাতে এই ফলাফলগুলি পাস করবে Fragment, যার মধ্যে ফলাফলগুলি প্রদর্শিত হবে। আপনি সম্ভবত যা আশা করেছিলেন তার থেকে বাস্তবায়নের জন্য আরও কিছু কাজ প্রয়োজন, তবে আমি নিশ্চিত যে আপনি আরও মডুলার তৈরি করতে পারেন এমন কিছু উপায় রয়েছে এবং এটি সম্ভবত আপনি সবচেয়ে ভাল করতে পারেন বলে মনে হয়।

পিএস আপনি যদি এই পদ্ধতির ব্যবহার করেন তবে ব্যাকস্ট্যাকটিতে ক্রিয়াকলাপগুলি যুক্ত / সরানো হয়েছে সেদিকে আপনার বিশেষ মনোযোগ দিতে হবে। এটি কীভাবে করা হতে পারে তার আরও কিছু তথ্যের জন্য এই পোস্টটি দেখুন ।

পিপিএস আপনি স্ট্যান্ডার্ড অনুসন্ধান ইন্টারফেসটি সম্পূর্ণরূপে ভুলে যেতে পারেন এবং নীচে রাঘবের পোস্টেFragment বর্ণিত একটি সাধারণ অনুসন্ধান কার্যকর করতে পারেন ।


@ অ্যালেক্স, টুকরোগুলি ব্যবহার করে স্ট্যান্ডার্ড অ্যান্ড্রয়েড অনুসন্ধান ইন্টারফেসটি প্রয়োগ করা অবশ্যই সম্ভব। তবে এটি অনেক বেশি কাজ নেয় ... :-)
বিনয় এস শানোয়

@VinaySShenoy হাঁ, আমি বলতে চাচ্ছি আপনি সমগ্র পুনরায় বাস্তবায়ন করতে চাই SearchManagerজন্য Fragmentডান গুলি? (বা এর মতো কিছু)
অ্যালেক্স লকউড

1
অনুসন্ধানের ফলাফলগুলি সরবরাহ করার জন্য, আপনি যা প্রস্তাব করেছিলেন তার অনুরূপ কিছু বাস্তবায়ন করেছি, ক্রিয়াকলাপের উদ্দেশ্যটি সরবরাহ করে যা এটি দৃশ্যমান হলে সঠিক খণ্ডে সরবরাহ করে। সবচেয়ে শক্তিশালী অংশটি আমাকে সঠিকভাবে ডেটা দিয়ে ফ্রেম লোডের পরামর্শ সারণী পুনরায় সাজিয়েছিল যাতে আমাকে পরামর্শগুলি প্রদর্শন করার পাশাপাশি সন্ধান জমা দেওয়ার ব্যবস্থা করতে এবং পরামর্শগুলিতে ক্লিক করতে হয়। তবে আমি এখন ভবিষ্যতের অ্যাপ্লিকেশনগুলির জন্য একটি সুন্দর কাঠামো পেয়েছি .. :-)
বিনয় এস শেনয়

আমি এটি একটি আরও ভাল উত্তর বলে মনে করেছি: stackoverflow.com/questions/6938952/… এটি খণ্ডগুলির মধ্যে থেকে "অনুসন্ধান" করার অনুমতি দেবে। সত্য, এটি গুগল সরবরাহ করা অফিশিয়াল অনুসন্ধান পদ্ধতি নয়, তবে এটি ঠিক কাজ করে।
কাইল ফ্যালকোনার

76

টুকরা ব্যবহার করে কিছু অনুসন্ধান করার উদাহরণ এখানে example আশা করি এটি সহায়তা করে এবং এটিই আপনি খুঁজছেন:

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);
        }
    }
}

ওপি "স্ট্যান্ডার্ড সার্চ ইন্টারফেস" চেয়েছিল, তবে এটি একটি সাধারণ "অনুসন্ধান" অর্জন Fragmentকরবে যাতে আমি অভিযোগ করব না। অভিনন্দন! : পি
অ্যালেক্স লকউড

30
পরের বার আপনি আপনার উত্স উদ্ধৃত করতে চাইতে পারেন ।
অ্যাড্রিয়ান সন্ন্যাসী

বিকাশকারীর সাইটে একটি অনুসন্ধান ইন্টারফেস তৈরি করা দেখুন । ওপি জিজ্ঞাসা করেছিল যে ডকুমেন্টেশনে বর্ণিত স্ট্যান্ডার্ড অ্যান্ড্রয়েড অনুসন্ধানের সাথে কাজ করে এমন কোনও "অনুসন্ধানযোগ্য-খণ্ড" তৈরি করা সম্ভব ছিল কি না?
অ্যালেক্স লকউড

কিছু ক্ষতি: 1-একটি কাস্টমাইজড অনুসন্ধান আইকন ব্যবহার করে কাজ করে না। 2-SearchView ইত্যাদি, বিষয়বস্তু নিষ্ক্রিয় ফিরে হ্যান্ডলিং, মত, কিছু ব্যবস্থাপনা কোড থাকতে হবে
AlikElzin-kilaka

আমার ক্ষেত্রে onQueryTextChangeপদ্ধতি বলা হচ্ছে না।
শজিল আফজাল

57

স্ট্যান্ডার্ড অ্যাকশনবার সন্ধান ভিউ অ্যাকশনভিউ এপিআই ব্যবহার করে কোনও খণ্ডে অনুসন্ধান করা বেশ সম্ভব। এটি অ্যাপকম্প্যাট সমর্থন ক্লাস v7 ব্যবহার করে অ্যান্ড্রয়েড ২.১ (এপিআই লেভেল)) এ আবার কাজ করবে।

আপনার খণ্ডে:

@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;
        }
    });
}

আপনার মেনুতে এক্সএমএল

<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" />

এটি নতুন অ্যাকশনবার্টিভিটি
অ্যাপকম্প্যাট ভি

1
গৃহীত উত্তরটি পড়ে আমি আশা হারিয়ে ফেলেছি ... অন্য উত্তরগুলি জটিল, আমি আপনার উত্তরটি পড়েছি !!! খুবই সোজা! এটি ধন্যবাদ ... আপনাকে অনেক ধন্যবাদ
এমবিএইচ

2
আমি মনে করি আমাদের onActivityCreated- এ setHasOptionsMenu (সত্য) যুক্ত করতে হবে। @ এমবিএইচ দ্বারা চিহ্নিত
রেমন্ড লুকানতা

2
@ গৌতম্যানম কেবল মেনু আইটেমটি ব্যবহার করুন H শো_এএসএ্যাকশন .... আপনি সক্ষম হলে অ্যাপকম্প্যাটটি পরবর্তী এপিআইগুলিতে হ্রাস করা হবে
ডেভিড

1
আরে @ গৌতম্যানম, এর মতো ব্যবহার করুন: item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
রড লিমা

15

অ্যাপকম্প্যাট সমর্থন ক্লাস v7 ব্যবহার করে। @ রুকি থেকে কেবল ডেভিডের সমাধানে কিছু যুক্ত করা সমাধান এটা একটা সহজ পদ্ধতিতে ঠিকমত কাজ, এখানে আমার টুকরা কোড পেতে:

মাইফ্রেগমেন্ট :

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

আমি onActivityCreatedডেকে না দিয়ে , কুজ যুক্ত করেছিsetHasOptionsMenu(true); সিস্টেমটি না করে জানতে পারবে না যে এই খণ্ডটি মেনুটির সাথে ইন্টারঅ্যাক্ট করতে হবে।

তারপরে আমি লাইনটি সরিয়েছি inflater.inflate(R.menu.main, menu); কারণ এটি মেনু আইটেমগুলিকে দ্বিগুণ করেছে যেহেতু ক্রিয়াকলাপটি কোনও মেনুতে স্ফীত করেছে, তারপরে টুকরাটি অন্য মেনুতে স্ফীত হয়েছে

@ ডেভিড এবং @ রুকিকে ধন্যবাদ


7

Fragmentsআপনার সাথে কাজ করার সময় এখনও Activityনিয়ন্ত্রণ এবং নির্ধারণের জন্য একটি ব্যবহার করা প্রয়োজন Fragments। এই Activityপূর্বের মত অনুসন্ধান কার্যকারিতা থাকতে পারে।

আমি সম্প্রতি একটি 'সাধারণ' Activityভিত্তিক অ্যাপ থেকে একটি Fragmentভিত্তিক অ্যাপে স্যুইচ করেছি এবং অনুসন্ধান কার্যকারিতা আমার জন্য একই কাজ করেছে।

আপনি কি এটিতে কাজ করার চেষ্টা করেছেন, এবং সফল হন নি? যদি হয় তবে আপনার প্রশ্নে আরও কিছু বিশদ দিন।

সম্পাদনা করুন:

আপনি একটি টুকরা নির্দিষ্ট অনুসন্ধানের আছে করতে চান তাহলে, সব আছে আপনার Fragmentsএকটি ইন্টারফেস প্রসারিত MyFragmentএকটি সঙ্গে startSearchপদ্ধতি, এবং আপনার আছে Activity'র startSearchপদ্ধতি কল বর্তমান টুকরা এর startSearchপদ্ধতি।


প্রয়োজনীয়তাটি হ'ল অ্যান্ড্রয়েড অনুসন্ধান ক্রিয়াকলাপের সাথে নয়, নির্দিষ্ট খণ্ডে আবদ্ধ। সুতরাং, না আমি এটি চেষ্টা করেছিলাম না।
ব্ল্যাকবেল্ট

আমি এখনও এটি চেষ্টা করে দেখিনি, তবে এটি আমি ঠিক যা খুঁজছি ঠিক এর মতো মনে হচ্ছে। আমার কাছে টুকরোগুলি সহ একটি নেভিগেশন ড্রয়ার রয়েছে যা প্রতিটিতে সম্পর্কিত নয় এমন অনুসন্ধানের বৈশিষ্ট্য রয়েছে। আমি অ্যান্ড্রয়েড অনুসন্ধান সিস্টেমকে পুরোপুরি বাইপাস করতে চাই না, সুতরাং এর মতো আমারও কিছু দরকার ছিল।
বেসিনেটর

5

আমি মনে করি আমি এটি অর্জন করেছি: আপনি টুকরোগুলি ব্যবহার করতে পারেন এবং একটি ক্রিয়া বারে একটি অনুসন্ধান আইকন যুক্ত করতে পারেন যাতে খণ্ডগুলির মধ্যে একটি অনুসন্ধান সম্ভব হয়। কৌশলটি হ'ল অ্যাকশন বার, একটি অ্যাকশন ভিউ, এর জন্য শ্রোতা, একটি লোডার এবং অবশ্যই অ্যাডাপ্টার।

এটি বেশ ভালভাবে কাজ করে যদিও এটি অ্যান্ড্রয়েড প্ল্যাটফর্ম অনুসন্ধান ব্যবস্থাকে সম্পূর্ণভাবে বাইপাস করে (তবে @ অ্যালেক্স লকউড কী বর্ণনা করেছে এবং অনুসন্ধানটি টুকরো টুকরো টুকরো টুকরো টানতে পারে তা খুঁজে পাওয়ার জন্য এটি কিছু কাজ দিয়ে শেষ করা যেতে পারে)। এটি কোনও ক্রিয়াকলাপের ক্ষেত্রে যেমন প্রত্যাশা মতো প্রত্যাশার সাথে প্রতিক্রিয়া জানায় না, তবে এটি কাজ করে: ব্যবহারকারীরা খণ্ডের ভিতরেই অনুসন্ধান করতে পারেন inside

কোডটি এখানে:

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

খণ্ড খণ্ড শ্রেণীর অনুসন্ধানের ফ্রেম (আমি উপরের ক্রিয়াকলাপের মধ্যে 2 টি উদাহরণ ব্যবহার করি)।

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

অনুসন্ধানের টুকরাগুলির মেনুটির জন্য এক্সএমএল ফাইলটি রেস / মেনু / মেনু_সার্চ.এক্সএমএল:

<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>

এবং এক্সএমএল লেআউট ফাইল রেজ / লেআউট / অনুসন্ধান_আইন_ফ্রেগমেন্টস.এমএমএল

<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>

আমি আরও উল্লেখ করতে চাই যে জ্যাক ওয়ার্টন SearchViewজটিলতার কারণে তার অ্যাকশনবার্লক লাইব্রেরিটির জন্য এটি বাস্তবায়ন না করার সিদ্ধান্ত নিয়েছে ( এখানে তার মন্তব্য দেখুন )। আপনি দেখতে পাচ্ছেন (এবং যেমনটি আমি আমার উত্তরে বর্ণনা করেছি), অ্যান্ড্রয়েডের অনুসন্ধান বাস্তবায়ন তুচ্ছ কিছু নয় ... এটি অন্তর্নিহিত সিস্টেমে অন্তর্ভুক্ত, এবং এটি তৃতীয় পক্ষের লাইব্রেরিগুলি লিখতেও অসুবিধাজনক করে তোলে (এবং এটি কিছু বলছে)। .. জ্যাক ওয়ার্টন তৃতীয় পক্ষের গ্রন্থাগারের চক নরিসের মতো!: ডি)।
অ্যালেক্স লকউড

কটাক্ষপাত SearchView.javaসোর্স কোড এখানে।
অ্যালেক্স লকউড

2
অ্যালেক্স, দেখে মনে হচ্ছে জ্যাক ওয়ার্টন তার
মতামত

এই দুটি এক্সএমএল ফাইলই কি একই রকম?
ক্লকার

@ ক্লোকার, দেখতে তাদের মতো মনে হচ্ছে। সত্যি, 2 বছর পরে আমি বলতে পারি না
স্নিকোলাস

5

ActionBarএবং ব্যবহার করুন SearchView। আপনি ক্রিয়াকলাপের সাথে কোনও সংযোগ ছাড়াই অনুসন্ধানগুলি পরিচালনা করতে সক্ষম হবেন। সন্ধান অনুসন্ধানে একটি সেট করুন OnQueryTextListener

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;
    }
});

কাস্টম অনুসন্ধানে আরও বিশদের জন্য এই পোস্টটি দেখুন ।


3

অন্যদের সমাধান ..... আমি তা পছন্দ করি না। এটি আমার পক্ষে আরও সহজ ut তবে এটি আমার ধারণা mআমি আপনার মতামতের জন্য অপেক্ষা করছি

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

টুকরা

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

একটি Fragmentএকটি বাহিরে উপস্থিত হতে পারে না Activity, কিংবা একটি ক্যান Fragmentএকটি লিঙ্ক করা android.intent.action.SEARCHবা অন্য কোন intent-filter

সুতরাং Activityমোড়কে কোনও ব্যবহার না করে Fragment, আপনি যা জিজ্ঞাসা করছেন তা সম্ভব নয়।


1

ভিউপাগারে টুকরোগুলির ক্ষেত্রে, যখন আমি সেই খণ্ডে নেই যেখানে আমি একটি অনুসন্ধান বার দিতে চাই তখন সন্ধান বোতামটি ব্লক করে এটি করতে পারতাম। ক্রিয়াকলাপের মধ্যে:

@Override
public boolean onSearchRequested() {

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

এবং কোনও শারীরিক অনুসন্ধান বোতাম না দেওয়ার ক্ষেত্রে আমি খণ্ডে একটি ক্রিয়া আইটেম যুক্ত করেছি, যা এই কোডটিকে ট্রিগার করে:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

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

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

1

আমি আশেপাশে একটি কাজ পেয়েছি :) আপনি নিজের বেসঅ্যাক্টিভিটিতে এই পদ্ধতিটি (স্টার্টএক্টিভিটি (ইন্টেন্ট)) ওভাররাইড করতে পারেন এবং তারপরে ক্রিয়াটি ACTION_SEARCH কিনা তা পরীক্ষা করে দেখুন আপনার বিশেষ কাজটি করুন: ডি

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

        }
    }

0

হ্যাঁ এটা সম্ভব,

দয়া করে আপনার ক্রিয়াকলাপে অনুসন্ধানের দৃশ্য প্রয়োগ করুন, ক্রিয়াকলাপে 'onQueryTextChange' এছাড়াও খণ্ডের সন্ধান শুনবে, আপনি 'onQueryTextChange' তে খণ্ডের দৃশ্যমানতাটি পরীক্ষা করতে পারেন, যদি এটি প্রদর্শিত হয় আপনি খণ্ডের জন্য আপনার অনুসন্ধান পদ্ধতিটি কল করতে পারেন, এটি আমার কোডে কাজ করে নিখুঁত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.