2013-06-30 4 views
0

검색 활동 (ActivitySearch.java)에서 소프트 키보드 '이동'버튼을 사용할 때 결과가 올바르게 반환되면 검색 제안에서 모든 결과가 반환됩니다. 나는 컨텐츠 제공자와 Cursor LoaderCallbacks를 사용한다. 이것은 처음으로 LoaderCallbacks를 시도하고 검색 작업을 수행하는 것입니다.검색 활동의 목록보기에서 onClickItem을 올바르게 구현하는 방법

이제 제안 된 결과 중 하나를 onClickItem/onClickItemListenter를 통해 클릭하고 사용자가 최종 선택을 위해 검색 목록보기로 되돌리려면 원하는 코드가 맞습니다. . 참고로 프로젝트의 모든 활동을 검색 가능으로 설정했습니다. 여러 샘플을 살펴 보았지만 올바른 방법을 수집하지 못했습니다.

저는 하드웨어 검색 키를 누르기 만하는 간단한 활동 (ActivityFloor.java)을 사용하고 있습니다. 버튼 몇 개만 누르면 의도를 시작할 수 있습니다.

내 검색 활동은 목록보기 결과에 기본 Android보기를 사용합니다. 또한 MyListActivity에서 활동을 상속하지만 공통 메뉴를 지원하기위한 것입니다. 여기

내 매니페스트의 :

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

여기에 고해상도 내 searchable.xml이야/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> 

여기 내 검색 활동 (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); 
    } 

} 

나는 NO 더 이상 오류가 발생하여 Micheal (아래), LOGCAT 오류는 무시할 수 있습니다.

나는 오류가 발생하지만, 완성을 위해 포함시킨 logcat에서 onClickItem 코딩을 구현 한 후에 만 ​​오류가 발생합니다.

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 

시간과 도움에 감사드립니다.

여기 내 활동의 공통 메뉴 인 MyActivity의 요지가 있습니다.

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

} 
} 
+0

무엇이'MyListActivity'입니까? – Raghunandan

+0

위에서 언급했듯이, Activity의 오버라이드이며, 공통된 메뉴 정보를 가지고 있습니다. 소스를 추가했습니다. –

+0

다른 프로젝트의 검색 활동을 가져 와서 코드를 바꾸었지만 여전히 동일한 결과가 나타납니다. –

답변

0

이 도움이

희망 listener을 설정할 필요가없는 Activity

.. 몇 주 동안이 기능을 켜고 끄고 코드가 조금 변경되었습니다. setContentView와 로컬 레이아웃이 결과를 얻지 못하는 문제라는 것을 알았습니다. 코드에 새 버전을 게시하겠습니다. 모두에게 감사드립니다.

package com.birdsall.tda; 

import android.app.LoaderManager; 
import android.app.SearchManager; 
import android.app.SearchableInfo; 
import android.content.ContentUris; 
import android.content.Context; 
import android.content.CursorLoader; 
import android.content.DialogInterface; 
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.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 

public class ActivitySearch extends MyListActivity implements 
    LoaderManager.LoaderCallbacks<Cursor> { 

private static String QUERY_EXTRA_KEY = "QUERY_EXTRA_KEY"; 
private static final String TAG = "ActivitySearch"; 

private SimpleCursorAdapter adapter; 

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

    Log.i(TAG, "onCreate"); 

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

    getLoaderManager().initLoader(0, null, this); 

    parseIntent(getIntent()); 


    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchableInfo searchableInfo = searchManager 
      .getSearchableInfo(getComponentName()); 

    Log.i(TAG, "onCreate at end"); 

} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    Log.i(TAG, "onNewIntent"); 
    parseIntent(getIntent()); 
} 

private void parseIntent(Intent intent) { 

    Log.i(TAG, "parseIntent"); 

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String searchQuery = intent.getStringExtra(SearchManager.QUERY); 
     // Perform the search 
     performSearch(searchQuery); 
    } 
} 

private void performSearch(String query) { 
    Log.i(TAG, "performSearch"); 
    Bundle args = new Bundle(); 
    args.putString(QUERY_EXTRA_KEY, query); 

    getLoaderManager().restartLoader(0, args, this); 
} 

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String query = "0"; 
    Log.i(TAG, "onCreateLoader"); 
    if (args != null) 
     query = args.getString(QUERY_EXTRA_KEY); 

    String[] projection = { TDAdb.KEY_ROWID, TDAdb.COL_RULETITLE }; 
    String where = TDAdb.COL_RULETITLE + " LIKE \"%" + query + "%\""; 

    String[] whereArgs = null; 
    String sortOrder = TDAdb.COL_RULETITLE; 

    return new CursorLoader(this, TDAProvider.CONTENT_URI_RULES, 
      projection, where, whereArgs, sortOrder); 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 

    adapter.swapCursor(cursor); 
    adapter.notifyDataSetChanged(); 

    Log.i(TAG, "onLoadFinished ... cursor has " + cursor.getCount() 
      + " row(s)"); 
       + " row(s)", Toast.LENGTH_SHORT).show(); 
} 

public void onLoaderReset(Loader<Cursor> loader) { 
    Log.i(TAG, "onLoaderReset"); 
    adapter.swapCursor(null); 
} 

/** 
* Listing 8-28: Providing actions for search result selection 
*/ 
@Override 
protected void onListItemClick(ListView listView, View view, int position, 
     long id) { 
    super.onListItemClick(listView, view, position, id); 

    Log.i(TAG, "onListItemClick"); 

    Uri selectedUri = ContentUris.withAppendedId(
      TDAProvider.CONTENT_URI_RULES, id); 

    Intent i = new Intent(ActivitySearch.this, ActivityRulesCrossRef.class); 
    Bundle extras = new Bundle(); 
    extras.putString("XRef", "N"); 
    String str_rowid = String.valueOf(id); 
    extras.putString("selectedID", str_rowid); 
    extras.putString("selectedRule", "Search"); 
    i.putExtras(extras); 
    startActivity(i); 
    finish(); 

} 

public void onDismiss(final DialogInterface arg0) { 
    finish(); 
} 

} 
0

노력이의

@Override 
public void onListItemClick(ListView parent, View v, int position, long id) 
{ 
//... 
} 

당신의 나는 약 2를 썼다

+0

Eclipse는 그것에 대해 불평합니다 : '메소드 setOnClickListener (View.OnClickListener) 형식의보기 (ActivitySearch) '에 적용 할 수 없습니다, 그래서 나는 다음과 같이 변경 :'mListView.setOnClickListener ((OnClickListener) this); ' 그러나 그것은 아직도 폭격한다. 내가 잘못 알고있는 mListView가 있다고 생각하거나 오버라이드해야하는 검색 클래스가있다. 제안 해 주셔서 감사합니다. –

+0

나는 폭탄 공격으로부터 프로그램을 중단하겠다는 당신의 제안을 받았지만, 항목을 선택한 후에도 여전히 내 listview에서 아무것도 얻지 못했다. 나는 원래 ActivitySearch를 업데이트한다. –

관련 문제