سؤال

أنا جديدة جدا لتطوير جافا والروبوت;ولقد تم العمل على التطبيق الذي أريد شريط العمل مع SearchView.لقد نظرت إلى أمثلة جوجل ولكن لا أستطيع الحصول عليه للعمل.يجب أن أفعل شيئا خاطئا وأنا على وشك التخلي عن تطوير التطبيق: د لقد بحثت ولكن لم أجد أي شيء مفيد.ربما يا رفاق يمكن أن تساعدني :)

المشكلة:أحصل على عرض البحث لفتح كما ينبغي، ولكن بعد ذلك لا يحدث شيء على الإطلاق ، لقد لاحظت أن بلدي مدير البحث.جيتسيرتشابلينفو (جيتكومبوننتنام ()) يعود لاغية.كما لا يتم عرض تلميحي الذي قدمته في مربع البحث الخاص بي مما يقودني إلى الاعتقاد بأنه ربما لا يمكن للتطبيق العثور على البحث الخاص بي.شمل?يكفي الحديث :)

النشاط الرئيسي.جافا

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);

        // Get the SearchView and set the searchable configuration
        SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
            (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

        return true;
    }
}

قابل للبحث.شمل

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_label">
</searchable>

أندرويدمانيفست

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.searchapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity android:name=".SearchableActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
        </activity>

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>           
        </activity>

        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>          

    </application>

</manifest>

البحث عن النشاط.جافا

package com.example.searchapp;

import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class SearchableActivity extends ListActivity {

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

        // Get the intent, verify the action and get the query
        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    private void doMySearch(String query) {
        Log.d("Event",query);
    }
}

وهنا رابط للمشروع المشار إليه ، سأكون ممتنا إلى الأبد إذا كان شخص ما لمساعدتي في هذا!

شفرة المصدر

هل كانت مفيدة؟

المحلول

مشكلتك هي في الروبوت الخاص بكواضح.كان لي بالضبط تقريبا كما تفعل ، لأن هذا هو ما أحصل عليه بعد الوثائق.لكنها غير واضحة أو خاطئة.

مشاهدة في مصدر العروض أبي وجدت أن " الروبوت.التطبيق.يجب أن تذهب البيانات الوصفية" القابلة للبحث "في نشاط" النتائج "، وفي النشاط الرئيسي (أو النشاط الذي تضع فيه عرض البحث) تشير إلى النشاط الآخر باستخدام "أندرويد".التطبيق.البحث الافتراضي".

يمكنك رؤيته في الملف التالي ، وهو البيان من مشروع الاختبار الخاص بي:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />
    </activity>
    <activity
        android:name=".SearchActivity"
        android:label="@string/app_name" >

        <!-- This intent-filter identifies this activity as "searchable" -->

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <!-- This metadata entry provides further configuration details for searches -->
        <!-- that are handled by this activity. -->

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>
</application>

ومن المهم أيضا أن التلميح والتسمية في للبحث.شمل هي المراجع ، وليس سلاسل ضمنية.

آمل أن يحل مشكلتك.استغرق الأمر مني كل يوم لمعرفة ذلك :(

نصائح أخرى

أدلة الروبوت يقول صراحة:

// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

وهو في حالتك غير صحيح.لأنك لا تريد البحث في مايناكتيفيتي ولكن في سيرتشابليكتيفيتي.وهذا يعني أنه يجب عليك استخدام هذا كومبوننتنام بدلا من جيتكومبوننتنام () الأسلوب:

ComponentName cn = new ComponentName(this, SearchableActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));

كما يبدو أن كلا من الروبوت: تلميح والروبوت: سمات التسمية يجب تكون إشارات إلى سلاسل في سلاسل.شمل.لا يبدو أن الكسل والتشفير الثابت لقيم السلسلة يعمل على الإطلاق :)

أي.لا تفعل:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="Search for something..."
    android:label="My App">
</searchable>

ولكن بالتأكيد تفعل (كما فعل البروتوكول الاختياري بشكل صحيح):

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_label">
</searchable>

إذا كنت تستخدم الروبوت ستوديو,

<meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />

جزء قد لا تعمل.

اكتب اسم الحزمة الكامل مثل

<meta-data
                android:name="android.app.default_searchable"
                android:value="com.example.test.SearchActivity" />

كن حذرا مع " شمل / للبحث.شمل".إذا قمت بعمل كود صلب مع android:hint و android:label. انها لن تعمل.هاها يجب أن يكون :

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/app_name"
android:label="@string/search_lb"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/>

في الواقع ليست هناك حاجة لاستخدام "الجزء المفقود" كما هو موضح في الإجابات أعلاه.هذه الطريقة (باستخدام SearchView) يعمل تماما كما تقول المستندات الرسمية حتى استخدام أداة البحث.هنا يجب إجراء تعديل طفيف على النحو التالي:

العقارات في أ SearchableInfo تستخدم لعرض الملصقات والتلميحات والاقتراحات وإنشاء نوايا لإطلاق شاشات نتائج البحث والتحكم في الإمكانيات الأخرى مثل زر الصوت(المستندات).

وهكذا ، فإن SearchableInfo كائن نمر إلى SearchView.setSearchableInfo(SearchableInfo s) يجب أن يحتوي على مراجع مناسبة للنشاط المستهدف الذي يجب عرضه لإظهار نتائج البحث.يتم ذلك عن طريق تمرير يدويا ComponentName من نشاطنا المستهدف.منشئ واحد لإنشاء ComponentName هو

public ComponentName (String pkg, String cls)

pkg و cls هي أسماء الحزم وأسماء الفئات للنشاط المستهدف الذي سيتم إطلاقه لعرض نتائج البحث.لاحظ أن:

pkg يجب أن تشير إلى اسم حزمة الجذر للمشروع الخاص بك و,

cls يجب أن يكون اسم مؤهل بالكامل للفئة (أي.كل شيء)

على سبيل المثال.:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    // Get the SearchView and set the searchable configuration
String pkg = "com.example.musicapp"
String cls = "com.example.musicapp.search.SearchActivity"
ComponentName mycomponent = new ComponentName(pkg,cls);       
SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(mycomponent));
searchView.setIconifiedByDefault(false);   //if using on actionbar
return true;
}

اعتمادا على الاحتياجات الخاصة بك نلقي نظرة على الآخر ComponentName الصانعين.

تأكد من الخاص بك searchables.xml الملف في الموقع الصحيح (أي ، في الخاص بك res/xml/ المجلد) وأن الملف نفسه لا يحتوي على أي أخطاء-وإلا ستجد ذلك (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName) سيعود فارغة ، وكسر وظيفة البحث الخاصة بك.

(أيضا ، تأكد من تعيين componentName بالطريقة المناسبة ، لأن المثال هو مبين في دليل الروبوت هو فقط عند إجراء عمليات البحث وعرض عمليات البحث في نفس النشاط.)

كنت أواجه نفس المشكلة بإضافة مرشح نية البحث مثل هذا إلى نشاط قابل للبحث:

   <activity
        android:launchMode="singleTop"
        android:name=".ui.activities.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

تحقق مرة أخرى مما إذا كان الإدخال المقابل(أي تلميح البحث وتسمية التطبيق) موجودا في القيم/السلاسل.شمل

على سبيل المثال

      <string name="app_label">FunApp</string>
      <string name="search_hint">Caps Off</string>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top