1

私はListActivity自分のアプリの主な活動をしています。リスト内のアイテムは検索可能である必要がありますが、当然、同じアクティビティを何度も開始したくありませんsingleTop。ただし、ユーザーが検索後にメイン リストに戻れるようにしたいので、問題が発生しています。現在、検索後に戻るとアプリが終了します。1 つの解決策は、特に検索を処理するためにリスト アクティビティのコピーを作成することですが、それが最善の方法だとは思えません。簡単に試してみましたが、試し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>
4

1 に答える 1

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);
        }
    }
    ...
}
于 2012-08-19T15:28:14.357 に答える