web-dev-qa-db-fra.com

Tiroir de navigation et pager de vue dans la même activité

J'essaie d'implémenter à la fois le tiroir de navigation et le téléavertisseur dans la même activité. Le tiroir de navigation fonctionne bien, mais le pager de vue ne fonctionne pas, je reçois également un pointeur nul sur le glissement vers la droite lorsque le tiroir de navigation est ouvert (pointeur Null sur Android. Support. V4. Widget. DrawerLayout. IsContentView (DrawerLayout.Java:840). I attache la disposition et le code principaux de xml ci-dessous.

<Android.support.v4.view.ViewPager
    Android:id="@+id/viewpager"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
</Android.support.v4.view.ViewPager>

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >     
    <ListView
        Android:id="@+id/left_drawer"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="#111"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp" />
</Android.support.v4.widget.DrawerLayout>

La classe d'activité est donnée ci-dessous

public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mPlanetTitles;
private MainActivity mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext = this;
    ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
    CustomPagerAdapter adapter = new CustomPagerAdapter(mContext);
    vp.setAdapter(adapter);
    vp.setPageTransformer(false, new ViewPager.PageTransformer() {

        @Override
        public void transformPage(View page, float position) {
            final float normalizedposition = Math.abs(Math.abs(position) - 1);
            page.setScaleX(normalizedposition / 2 + 0.5f);
            page.setScaleY(normalizedposition / 2 + 0.5f);
        }
    });

    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
                                   */
            ) {
                @Override
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to
                                             // onPrepareOptionsMenu()
                }

                @Override
                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to
                                             // onPrepareOptionsMenu()
                }

            };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {
        selectItem(0);
    }
}

@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);
    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
    return true;
}

/* 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 selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

public class CustomPagerAdapter extends PagerAdapter {

    private Context context;

    int index = 2;

    // public CustomPagerAdapter(Context context, Vector<View> pages) {
    // this.context = context;
    // this.pages = pages;
    // }

    public CustomPagerAdapter(Context context) {
        this.context = context;
        this.index = 2;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = (LayoutInflater.from(container.getContext()));
        // View page = pages.get(position);
        View view = null;
        if (position == 0) {
            view = inflater.inflate(R.layout.page_one_views, null);
            ((ViewPager) container).addView(view);

        }
        else {
            // page.setBackgroundColor(colors.get(position));
            // container.addView(page);
            view = inflater.inflate(R.layout.page_two, null);
            ((ViewPager) container).addView(view);
        }
        return view;
    }

    @Override
    public int getCount() {
        return index;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}

}

Aidez-moi, s'il vous plaît. Merci d'avance

22
Sunny

DrawerLayout doit être l'élément racine. Mettez le ViewPager à l'intérieur.

<Android.support.v4.widget.DrawerLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v4.view.ViewPager
        Android:id="@+id/viewpager"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" />

    <ListView 
        Android:id="@+id/left_drawer"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="#111"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp" />
</Android.support.v4.widget.DrawerLayout>
30
TMH
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >

<Android.support.v4.view.ViewPager xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/pager"
Android:layout_width="match_parent"
Android:layout_height="match_parent">

</Android.support.v4.view.ViewPager>

<ListView
    Android:id="@+id/left_drawer"
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:layout_below="@+id/top_bar"
    Android:background="@Android:color/darker_gray"
    Android:choiceMode="singleChoice"
    Android:divider="@Android:color/background_dark"
    Android:dividerHeight="1dp" />

</Android.support.v4.widget.DrawerLayout>
7
Daniel 'DT' Assis

Pour réaliser quelque chose comme ça:

enter image description here

Utilisez un simple:

 <Android.support.v4.widget.DrawerLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/drawer_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >    

       <Android.support.v7.widget.Toolbar
             Android:id="@+id/toolbar"
             Android:layout_width="match_parent"
             Android:layout_height="?attr/actionBarSize"
             Android:background="?attr/colorPrimary"
             app:popupTheme="@style/AppTheme.PopupOverlay"/>

        <Android.support.v4.view.ViewPager
             Android:id="@+id/viewpager"
             Android:layout_width="fill_parent"
             Android:layout_height="fill_parent" >
        </Android.support.v4.view.ViewPager>

        <ListView
            Android:id="@+id/left_drawer"
            Android:layout_width="240dp"
            Android:layout_height="match_parent"
            Android:layout_gravity="start"
            Android:background="#111"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp" />
    </Android.support.v4.widget.DrawerLayout>
1
Farid