SlidingMenuDawer和片段主要细节

时间:2014-01-16 17:36:32

标签: android android-fragments master-detail slidingdrawer

我正在尝试使用主细节片段实现Slidingmenu

有可能是FrameLayout,包含两个主细节片段吗?请帮忙。

logcat的:

01-16 18:17:23.815: E/AndroidRuntime(11617): FATAL EXCEPTION: main
01-16 18:17:23.815: E/AndroidRuntime(11617): android.view.InflateException: Binary XML file line #23: Error inflating class fragment
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at com.example.android.fragments.ListArticlActivity.onCreateView(ListArticlActivity.java:39)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.BackStackRecord.run(BackStackRecord.java:635)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.os.Handler.handleCallback(Handler.java:615)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.os.Looper.loop(Looper.java:137)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.ActivityThread.main(ActivityThread.java:4745)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.reflect.Method.invokeNative(Native Method)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.reflect.Method.invoke(Method.java:511)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at dalvik.system.NativeStart.main(Native Method)
01-16 18:17:23.815: E/AndroidRuntime(11617): Caused by: java.lang.NullPointerException: name == null
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.VMClassLoader.findLoadedClass(Native Method)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:354)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.ClassLoader.loadClass(ClassLoader.java:491)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.Fragment.instantiate(Fragment.java:574)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.Fragment.instantiate(Fragment.java:552)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.app.Activity.onCreateView(Activity.java:4656)
01-16 18:17:23.815: E/AndroidRuntime(11617):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
01-16 18:17:23.815: E/AndroidRuntime(11617):    ... 18 more

布局主要细节

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:baselineAligned="false">

    <fragment 
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment 
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>

显示主要细节的片段

package com.example.android.fragments;

import android.os.Bundle;
import android.app.Fragment;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ListArticlActivity extends Fragment
       {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(false);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.news_articles, container, false);

        // Check whether the activity is using the layout version with
        // the fragment_container FrameLayout. If so, we must add the first fragment
       if (getView().findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.


            // Create an instance of ExampleFragment
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an Intent,
            // pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getActivity().getIntent().getExtras());

            FragmentTransaction fm =  getFragmentManager().beginTransaction();

            // Add the fragment to the 'fragment_container' FrameLayout
            fm.add(R.id.fragment_container, firstFragment);
            fm.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            fm.commit();

      }

        return view;
    }


}

MainActivity

package com.example.android.fragments;

import java.util.ArrayList;
import com.example.android.fragments.R;
import com.example.android.fragments.adapter.NavDrawerListAdapter;
import com.example.android.fragments.model.NavDrawerItem;


import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;


import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SearchView;

public class MainActivity extends Activity  {

    // action bar
    private ActionBar actionBar;

    // Refresh menu item
    private MenuItem refreshMenuItem;

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        actionBar = getActionBar();

        //actionBar.hide();
        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
        // What's hot, We  will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));


        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }



    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        case R.id.action_search:
            // search action
            return true;
        case R.id.action_location_found:
            // location found
            //LocationFound();
            return true;
        case R.id.action_refresh:
            // refresh
            refreshMenuItem = item;
            // load the data from server
            new SyncData().execute();
            return true;
        case R.id.action_help:
            // help action
            return true;
        case R.id.action_check_updates:
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    private class SyncData extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            // set the progress bar view
            refreshMenuItem.setActionView(R.layout.action_progressbar);

            refreshMenuItem.expandActionView();
        }

        @Override
        protected String doInBackground(String... params) {
            // not making real request in this demo
            // for now we use a timer to wait for sometime
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            refreshMenuItem.collapseActionView();
            // remove the progress bar view
            refreshMenuItem.setActionView(null);
        }
    };
    /***
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = new HomeFragment();
            //getFragmentManager().beginTransaction().replace(R.id.content_frame, new ListArticlActivity()).commit();
            break;
        case 1:
            fragment = new ListArticlActivity();
            //actionBar.show();
            break;
        case 2:
         //   fragment = new myfragment();
            break;
        case 3:
            //fragment = new CommunityFragment();
            break;
        case 4:
            //fragment = new PagesFragment();
            break;
        case 5:
           // fragment = new WhatsHotFragment();
            break;

        default:
            break;
        }

        if (fragment != null) {
            //FragmentManager fragmentManager = getFragmentManager();
            getFragmentManager().beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

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

    public boolean onCreateOptionsMenu(Menu menu) {

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



    // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));

    return super.onCreateOptionsMenu(menu);
}





}

持有人主要布局

<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" >

    <FrameLayout
       android:id="@+id/content_frame"
       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="@color/purple_dark"
       android:choiceMode="singleChoice"
       android:divider="@android:color/darker_gray"
       android:dividerHeight="0.1dp"
       android:listSelector="@drawable/navdrawer_listselector"/>

</android.support.v4.widget.DrawerLayout>

0 个答案:

没有答案