page.title=Remaining Backward Compatible
trainingnavtop=true
previous.title=Storing and Searching for Data
previous.link=search.html

@jd:body

  <div id="tb-wrapper">
    <div id="tb">
      <h2>This lesson teaches you to</h2>

      <ul>
        <li><a href="{@docRoot}training/search/backward-compat.html#set-sdk">Set Minimum
        and Target API levels</a></li>

        <li><a href="{@docRoot}training/search/backward-compat.html#provide-sd">Provide the Search
        Dialog for Older Devices</a></li>

        <li><a href="{@docRoot}training/search/backward-compat.html#check-ver">Check the Android Build
        Version at Runtime</a></li>
      </ul>
    </div>
  </div>

  <p>The {@link android.widget.SearchView} and action bar are only available on Android 3.0 and
  later. To support older platforms, you can fall back to the search dialog. The search dialog is a
  system provided UI that overlays on top of your application when invoked.</p>

  <h2 id="set-sdk">Set Minimum and Target API levels</h2>

  <p>To setup the search dialog, first declare in your manifest that you want to support older
  devices, but want to target Android 3.0 or later versions. When you do this, your application
  automatically uses the action bar on Android 3.0 or later and uses the traditional menu system on
  older devices:</p>
  <pre>
&lt;uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /&gt;

&lt;application&gt;
...
</pre>

  <h2 id="provide-sd">Provide the Search Dialog for Older Devices</h2>

  <p>To invoke the search dialog on older devices, call {@link
  android.app.Activity#onSearchRequested onSearchRequested()} whenever a user selects the search
  menu item from the options menu. Because Android 3.0 and higher devices show the
  {@link android.widget.SearchView} in the action bar (as demonstrated in the first lesson), only versions
  older than 3.0 call {@link android.app.Activity#onOptionsItemSelected onOptionsItemSelected()} when the
  user selects the search menu item.
  </p>
  <pre>
&#64;Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}
</pre>

  <h2 id="check-ver">Check the Android Build Version at Runtime</h2>

  <p>At runtime, check the device version to make sure an unsupported use of {@link
  android.widget.SearchView} does not occur on older devices. In our example code, this happens in
  the {@link android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()} method:</p>
  <pre>
&#64;Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB) {
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }
    return true;
}
</pre>
