2012-08-17 85 views
1

我有一个ListActivity作为我的应用程序的主要活动。列表中的项目应该是可搜索的,但自然我不想一次又一次地开始同一活动,因此singleTop。但是,我确实希望用户能够在搜索后返回主列表,这给我带来了一些麻烦。目前,搜索后按回来将终止该应用程序。一种解决方案是专门制作一份列表活动的副本来处理搜索,但我无法想象这是最好的解决方法。我简要地尝试了activity-alias,但是我尝试过的每个置换都不会改变行为或改为执行Web搜索。我不知道activity-alias是否合适,但我已经包含了一个例子。单击可搜索的活动终止时按下按钮

我的问题是,有没有最好的方式来实现我想要做的事情,不涉及多余的代码维护?

<activity 
    android:name=".MainListActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
<activity-alias 
    android:name=".SearchList" 
    android:targetActivity=".MainListActivity" 
    android:launchMode="singleTop"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity-alias> 

回答

1

我发现了一个令人尴尬的简单解决方案。

清单:

<activity 
    android:name=".MainListActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <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> 

列表/搜索活动:

public class MainListActivity extends FragmentActivity 
implements LoaderManager.LoaderCallbacks<Cursor> 
{ 
    private boolean searching = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_cheapest); 
     dbHelper = new DatabaseHelper(this); 

     String[] fromColumns = {"pname", "store", "unit_price"}; 
     int[] toViews = 
      {R.id.entryProductName, R.id.entryStore, R.id.entryUnitPrice}; 
     adapter = new SimpleCursorAdapter(this, R.layout.cheapest_row_entry, 
      null, fromColumns, toViews); 

     ListView lv = (ListView)findViewById(android.R.id.list); 
     lv.setAdapter(adapter); 
     lv.setEmptyView(findViewById(android.R.id.empty)); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> l, View v, int position, 
      long id) { 
       searching = false; 
       startActivity(new Intent(getBaseContext(), 
        EditProductActivity.class).putExtra("pid", ""+id)); 
      } 
     }); 
     handleIntent(getIntent()); 
    } 

    @Override 
    public void onBackPressed() { 
     if (searching) { 
      searching = false; 
      getSupportLoaderManager().restartLoader(LOADER_MAIN, null, this); 
     } else { 
      finish(); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     handleIntent(intent); 
    } 

    private void handleIntent(Intent intent) { 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      searching = true; 
      filter = intent.getStringExtra(SearchManager.QUERY); 
      getSupportLoaderManager().restartLoader(LOADER_SEARCH, null, this); 
     } else { 
      getSupportLoaderManager().initLoader(LOADER_MAIN, null, this); 
     } 
    } 
    ... 
} 

不过,我也第一次得到activity-alias工作。我将它列入后人。

清单:

<activity 
    android:name=".MainListActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <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=".SearchListActivity" /> 
</activity> 
<activity-alias 
    android:name=".SearchListActivity" 
    android:launchMode="singleTop" 
    android:targetActivity=".MainListActivity" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" 
     android:value=".SearchListActivity" /> 
</activity-alias> 

列表/搜索活动:

public class MainListActivity extends FragmentActivity 
implements LoaderManager.LoaderCallbacks<Cursor> 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_view); 
     ... 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> l, View v, int position, 
      long id) { 
       if (Intent.ACTION_SEARCH.equals(getIntent().getAction())) { 
        finish(); 
       } 
       startActivity(new Intent(getBaseContext(), 
        EditProductActivity.class).putExtra("pid", ""+id)); 
      } 
     }); 
     handleIntent(getIntent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     handleIntent(intent); 
    } 

    private void handleIntent(Intent intent) { 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      filter = intent.getStringExtra(SearchManager.QUERY); 
      getSupportLoaderManager().restartLoader(LOADER_SEARCH, null, this); 
     } else { 
      getSupportLoaderManager().initLoader(LOADER_MAIN, null, this); 
     } 
    } 
    ... 
} 
相关问题