NavigationDrawer en utilisant uniquement Android Support Library
est il un exemple de projet qui utilisent uniquement Android Support Library (révision 18) pour mettre en œuvre la Navigation Tiroir sur Android +2.2 sans utiliser un autre bibliothèque (ABS etc.) ? Voici l'exemple qui utilisent l'ASL mais c'est un travail uniquement sur les API +14 : http://developer.android.com/training/implementing-navigation/nav-drawer.html .
Voici mon MainActivity:
package com.example.android.navigationdrawerexample;
import java.util.Locale;
import android.app.Activity;
//import android.app.Fragment;
//import android.app.FragmentManager;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.SearchManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mPlanetTitles;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTitle = mDrawerTitle = getTitle();
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
//set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
//set up the drawer's list view with items and click listener
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
//enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
/* ActionBarDrawerToggle ties together the the proper interactions
between the sliding drawer and the action bar app icon */
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); //creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); //creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(0);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//The action bar home/up action should open or close the drawer.
//ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
//Handle action buttons
switch(item.getItemId()) {
case R.id.action_websearch:
//create intent to perform web search for this planet
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, getActionBar().getTitle());
//catch event that there's no activity to handle intent
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
private void selectItem(int position) {
//update the main content by replacing fragments
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
//update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
/**
* Fragment that appears in the "content_frame", shows a planet
*/
public static class PlanetFragment extends Fragment {
public static final String ARG_PLANET_NUMBER = "planet_number";
public PlanetFragment() {
//Empty constructor required for fragment subclasses
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
int i = getArguments().getInt(ARG_PLANET_NUMBER);
String planet = getResources().getStringArray(R.array.planets_array)[i];
int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
"drawable", getActivity().getPackageName());
((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
getActivity().setTitle(planet);
return rootView;
}
}
}
et bien sur j'ai changer minSdk à 8, mais ça ne fonctionne toujours pas.
OriginalL'auteur user1518451 | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Abord, vous avez besoin d'étendre ActionBarActivity au lieu de FragmentActivity
Deuxième changement de votre Application Thème de @style/Thème.AppCompat ou @style/Thème.AppCompat.La lumière
Troisième changement chaque appel à getActionBar() pour getSupportActionBar() et invalidateOptionsMenu() pour supportInvalidateOptionsMenu()
Qui devrait le faire, voici l'exemple google à l'aide de AppCompat-v7 j'ai fait pour tester, j'ai aussi utilisé un adaptateur personnalisé pour la liste de simplement ignorer que 🙂
https://github.com/BradleyRL/NavDrawerExampleAppCompat-v7
Failed to find style 'textViewStyle' in current theme android.content.res.Resources$NotFoundException "?attr/listPreferredItemHeightSmall" in attribute "minHeight" is not a valid format.
Avez-vous d'exporter l'ensemble du projet? et la bibliothèque AppCompat-v7 sur eclipse?
Oui je l'importation ensemble du projet et ajouter android-support-v7-appcompat.jar pour libs. Toute autre suggestion ?
Vous n'avez pas à ajouter de la android-support-v7-appcompat.jar de répertoire libs :S vous mieux lire comment configurer la bibliothèque à partir du site google developer.android.com/tools/support-library/setup.html en particulier la section "Ajout de bibliothèques avec les ressources de la section"
Maintenant, j'ai une erreur: Le conteneur
Android Dependencies' references non existing library '/home/jack/Android/adt-bundle-linux-x86-20130522/sdk/extras/android/support/v7/appcompat/bin/android-support-v7-appcompat.jar
Ant d'autres suggestion ?OriginalL'auteur BradR
tout ce que vous avez à faire est d'importer le v4 bibliothèque de prise en charge de votre projet et vous pouvez simplement suivre l'exemple dans les docs que vous avez lié.
c'est la même chose pour n'importe quelle version d'android 2.2 et de la place, il suffit de remplacer n'importe quel fragment de l'utiliser avec le soutien fragment d'utilisation de la bibliothèque
J'ai téléchargé et exécuter ce projet, mais il travail sur l'API de +14.
il ne fonctionne que sur SDK 14 et parce que c'est ce que l'exemple de projet est définie pour. faire votre propre projet de réglage de la min le sdk 8 et suivre le tutoriel. Quel est le problème que vous rencontrez lors de l'exécution de l'exemple?
J'ai ajouté le code pour le premier post.
il ne veut toujours pas me dire quel est le problème que vous rencontrez. Faire ce que j'ai dit, de créer un nouvel exemple de projet à l'aide de ce que vous voulez, l'importation de la bibliothèque et de suivre le tutoriel et à ne pas utiliser le code de la démo de projet
OriginalL'auteur tyczj
Ce qui vous fait penser qu'il ne fonctionne que sur les API 14+? Si c'est le minSDKVersion dans le Manifeste du téléchargeables exemple, je suppose que c'est juste pour en avoir le Holo Thème qu'ils utilisent.
Il suffit de changer minSDKVersion à 8 et réparer ce qui a besoin de fixation pour le match. Le NavigationDrawer lui-même doit travailler avec SDKVersions que 4 c'est dans la version v4 de la bibliothèque de prise en charge.
Au lieu de poster tout votre code, essayer d'expliquer ce qu'est exactement ne fonctionne pas comme prévu. Personne ne va lire comme un bouquet de code.
OriginalL'auteur Ridcully