Saya memiliki aktivitas pencarian (ActivitySearch.java) yang mengembalikan hasil dengan benar ketika saya menggunakan tombol 'Go' pada keyboard lunak, ia mengembalikan semua hasil dari saran pencarian. Saya menggunakan Penyedia Konten dan Cursor LoaderCallbacks. Ini pertama kalinya saya mencoba LoaderCallbacks dan melakukan aktivitas pencarian.
Sekarang saya ingin dapat mengklik salah satu hasil yang disarankan melalui onClickItem/onClickItemListenter, dan mengembalikannya ke tampilan daftar pencarian untuk pilihan akhir oleh pengguna, tetapi jelas saya tahu kode saya tidak benar. FYI, saya telah mengaktifkan semua aktivitas saya di proyek sebagai dapat dicari. Saya telah melihat banyak sampel tetapi saya belum dapat menemukan metode yang benar.
Saya menggunakan aktivitas sederhana (ActivityFloor.java) yang saya tekan tombol pencarian perangkat keras, hanya beberapa tombol, yang memulai maksud.
Aktivitas pencarian saya menggunakan tampilan default Android untuk hasil tampilan daftar. Itu juga mewarisi aktivitasnya dari MyListActivity, tapi ini untuk mendukung menu umum.
Inilah manifes saya:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.birdsall.tda"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:exported="true" >
<meta-data android:name="com.google.android.apps.drive.APP_ID" android:value="id=12345" />
<intent-filter>
<action android:name="com.google.android.apps.drive.DRIVE_OPEN" />
<data android:mimeType="application/vnd.google-apps.drive-sdk.12345" />
<data android:mimeType="image/png" />
<data android:mimeType="image/jpeg" />
<data android:mimeType="image/jpg" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".ActivitySearch" />
<activity
android:name="com.birdsall.tda.ActivityMain"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityFloor" >
</activity>
<provider
android:name="com.birdsall.tda.TDAProvider"
android:authorities="com.birdsall.tda.contentprovidertda"
android:exported="true"
android:readPermission="true"
android:writePermission="true" />
<activity
android:name=".ActivitySearch"
android:label="Rule Search"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
</application>
</manifest>
Ini searchable.xml saya di res/xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:searchSettingsDescription="@string/search_description"
android:searchSuggestAuthority="com.birdsall.tda.contentprovidertda"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestIntentData="content://com.birdsall.tda.TDAProvider/rules"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>
Inilah aktivitas pencarian saya (ActivitySearch.java):
package com.birdsall.tda;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.SearchManager;
import android.content.ContentUris;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class ActivitySearch extends MyListActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
private static String QUERY_EXTRA_KEY = "QUERY_EXTRA_KEY";
private SimpleCursorAdapter adapter;
private final String TAG = "ActivitySearch";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
View mListView = getListView();
Log.i(TAG, "onCreate ... after setOnItemClickListener");
Toast.makeText(getApplicationContext(), "onCreate ... after setOnItemClickListener", Toast.LENGTH_LONG).show();
// Create a new adapter and bind it to the List View
adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
new String[] { TDAdb.COL_RULETITLE },
new int[] { android.R.id.text1 }, 0);
setListAdapter(adapter);
// Initiate the Cursor Loader
getLoaderManager().initLoader(0, null, this);
// Get the launch Intent
parseIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.i(TAG, "onNewIntent");
Toast.makeText(getApplicationContext(), "onNewIntent", Toast.LENGTH_LONG).show();
parseIntent(getIntent());
}
private void parseIntent(Intent intent) {
// If the Activity was started to service a Search request,
// extract the search query.
Log.i(TAG, "parseIntent");
Toast.makeText(getApplicationContext(), "parseIntent", Toast.LENGTH_LONG).show();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String searchQuery = intent.getStringExtra(SearchManager.QUERY);
// Perform the search, passing in the search query as an argument
// to the Cursor Loader
Bundle args = new Bundle();
args.putString(QUERY_EXTRA_KEY, searchQuery);
// Restart the Cursor Loader to execute the new query.
getLoaderManager().restartLoader(0, args, this);
}
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Log.i(TAG, "onCreateLoader");
Toast.makeText(getApplicationContext(), "onCreateLoader", Toast.LENGTH_LONG).show();
String query = "0";
if (args != null) {
// Extract the search query from the arguments.
query = args.getString(QUERY_EXTRA_KEY);
}
// Construct the new query in the form of a Cursor Loader.
String[] projection = { TDAdb.KEY_ROWID, TDAdb.COL_RULETITLE };
String where = TDAdb.COL_RULETITLE + " LIKE \"%" + query + "%\"";
String[] whereArgs = null;
String sortOrder = TDAdb.COL_RULETITLE;
// Create the new Cursor loader.
return new CursorLoader(this, TDAProvider.CONTENT_URI_RULES,
projection, where, whereArgs, sortOrder);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Replace the result Cursor displayed by the Cursor Adapter with
// the new result set.
Log.i(TAG, "onLoadFinished");
Toast.makeText(getApplicationContext(), "onLoadFinished", Toast.LENGTH_LONG).show();
if (adapter == null) {
Log.i(TAG, "onLoadFinished ... adapter is NULL");
Toast.makeText(getApplicationContext(), "onLoadFinished ... adapter is NULL", Toast.LENGTH_LONG).show();
this.finish();
}
Log.i(TAG, "onLoadFinished ... adapter is valued");
Toast.makeText(getApplicationContext(), "onLoadFinished ... adapter is valued", Toast.LENGTH_LONG).show();
adapter.swapCursor(cursor);
}
public void onLoaderReset(Loader<Cursor> loader) {
// Remove the existing result Cursor from the List Adapter.
Log.i(TAG, "onLoaderReset");
Toast.makeText(getApplicationContext(), "onLoaderReset", Toast.LENGTH_LONG).show();
adapter.swapCursor(null);
}
private void handleIntent(Intent intent) {
Log.i(TAG, "handleIntent");
Toast.makeText(getApplicationContext(), "handleIntent", Toast.LENGTH_LONG).show();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// Gets the search query from the voice recognizer intent
String query = intent.getStringExtra(SearchManager.QUERY);
// Set the search box text to the received query and submit the
// search
// mSearchView.setQuery(query, true);
}
}
@Override
protected void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
Toast.makeText(getApplicationContext(),
" search listview position:" + position,
Toast.LENGTH_LONG).show();
// Create a URI to the selected item.
Uri selectedUri =
ContentUris.withAppendedId(TDAProvider.CONTENT_URI, id);
// Create an Intent to view the selected item.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(selectedUri);
// Start an Activity to view the selected item.
startActivity(intent);
}
}
SAYA TIDAK LAGI MENDAPATKAN KESALAHAN, TERIMA KASIH KEPADA Micheal (di bawah), Sehingga kesalahan LOGCAT dapat diabaikan.
Saya mendapatkan kesalahan, tetapi hanya setelah mencoba menerapkan pengkodean onClickItem dari logcat saya yang telah saya sertakan untuk kelengkapan.
06-2923:56:57.416: I/TDAProvider(13786): query
06-2923:56:57.439: W/SuggestionsAdapter(13786): Search suggestions query threw an exception.
06-2923:56:57.439: W/SuggestionsAdapter(13786): java.lang.IndexOutOfBoundsException
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.net.Uri$PathSegments.get(Uri.java:978)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.net.Uri$PathSegments.get(Uri.java:963)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at com.birdsall.tda.TDAProvider.query(TDAProvider.java:180)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.content.ContentProvider.query(ContentProvider.java:652)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.content.ContentResolver.query(ContentResolver.java:370)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.content.ContentResolver.query(ContentResolver.java:313)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.app.SearchManager.getSuggestions(SearchManager.java:823)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.widget.SuggestionsAdapter.runQueryOnBackgroundThread(SuggestionsAdapter.java:190)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.widget.CursorFilter.performFiltering(CursorFilter.java:49)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.os.Handler.dispatchMessage(Handler.java:99)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.os.Looper.loop(Looper.java:137)
06-2923:56:57.439: W/SuggestionsAdapter(13786): at android.os.HandlerThread.run(HandlerThread.java:60)
06-2923:57:00.002: I/TDAProvider(13786): query
06-2923:57:00.049: I/TDAProvider(13786): query return cursor
06-2923:57:00.635: I/TDAProvider(13786): query
06-2923:57:00.635: I/TDAProvider(13786): query return cursor
06-2923:57:01.275: I/TDAProvider(13786): query
06-2923:57:01.275: I/TDAProvider(13786): query return cursor
06-2923:57:02.650: W/InputEventReceiver(13786): Attempted to finish an input event but the input event receiver has already been disposed.
06-2923:57:02.689: I/ActivitySearch(13786): onCreate
06-2923:57:02.728: D/AndroidRuntime(13786): Shutting down VM
06-2923:57:02.728: W/dalvikvm(13786): threadid=1: thread exiting with uncaught exception (group=0x40e1b2a0)
06-2923:57:02.728: E/AndroidRuntime(13786): FATAL EXCEPTION: main
06-2923:57:02.728: E/AndroidRuntime(13786): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.birdsall.tda/com.birdsall.tda.ActivitySearch}: java.lang.ClassCastException: com.birdsall.tda.ActivitySearch cannot be cast to android.view.View$OnClickListener
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2136)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread.access$700(ActivityThread.java:141)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.os.Handler.dispatchMessage(Handler.java:99)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.os.Looper.loop(Looper.java:137)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread.main(ActivityThread.java:5059)
06-2923:57:02.728: E/AndroidRuntime(13786): at java.lang.reflect.Method.invokeNative(Native Method)
06-2923:57:02.728: E/AndroidRuntime(13786): at java.lang.reflect.Method.invoke(Method.java:511)
06-2923:57:02.728: E/AndroidRuntime(13786): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
06-2923:57:02.728: E/AndroidRuntime(13786): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
06-2923:57:02.728: E/AndroidRuntime(13786): at dalvik.system.NativeStart.main(Native Method)
06-2923:57:02.728: E/AndroidRuntime(13786): Caused by: java.lang.ClassCastException: com.birdsall.tda.ActivitySearch cannot be cast to android.view.View$OnClickListener
06-2923:57:02.728: E/AndroidRuntime(13786): at com.birdsall.tda.ActivitySearch.onCreate(ActivitySearch.java:39)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.Activity.performCreate(Activity.java:5058)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
06-2923:57:02.728: E/AndroidRuntime(13786): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
06-2923:57:02.728: E/AndroidRuntime(13786): ... 11 more
06-2923:57:04.392: I/Process(13786): Sending signal. PID: 13786 SIG: 9
Terima kasih atas waktu dan bantuannya sebelumnya.
Inilah inti dari MyActivity, hanya menu umum untuk Aktivitas saya.
package com.birdsall.tda;
import android.app.ListActivity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
public class MyListActivity extends ListActivity {
String selectParam = "";
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, ActivityMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.am_index:
Intent i1 = new Intent(this, ActivityIndex.class);
startActivity(i1);
return true;
/* ... More menu items */
default:
return super.onOptionsItemSelected(item);
}
}
}
MyListActivity
? - person Raghunandan   schedule 30.06.2013