Android 从NavigationDrawer启动活动

Android 从NavigationDrawer启动活动,android,android-fragments,android-activity,fragment,gallery,Android,Android Fragments,Android Activity,Fragment,Gallery,我从零开始重写我的应用程序,因为我希望它更加现代和直观。为此,我使用了带有片段的NavigationDrawer布局 现在,我希望用户单击NavigationDrawer的一个选项可以启动另一个活动(而不是片段),这是一个墙纸选择器 我的代码可以工作,但当用户这样做时,MainActivity崩溃。为什么? 以下是主要活动: public class MainActivity extends Activity { private DrawerLayout mDrawerLayout;

我从零开始重写我的应用程序,因为我希望它更加现代和直观。为此,我使用了带有片段的NavigationDrawer布局

现在,我希望用户单击NavigationDrawer的一个选项可以启动另一个活动(而不是片段),这是一个墙纸选择器

我的代码可以工作,但当用户这样做时,MainActivity崩溃。为什么?

以下是主要活动:

public class MainActivity extends Activity {

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

  private CharSequence mDrawerTitle;
  private CharSequence mTitle;
  CustomDrawerAdapter adapter;

  List<DrawerItem> dataList;

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

        // Initializing
        dataList = new ArrayList<DrawerItem>();
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
                    GravityCompat.START);

        // Add Drawer Item to dataList
        dataList.add(new DrawerItem("Launchers", R.drawable.ic_action_email));
        dataList.add(new DrawerItem("Extras", R.drawable.ic_action_good));
        dataList.add(new DrawerItem("Support", R.drawable.ic_action_gamepad));
        dataList.add(new DrawerItem("Contact", R.drawable.ic_action_labels));
        dataList.add(new DrawerItem("Wallpapers", R.drawable.ic_action_search));
        dataList.add(new DrawerItem("Import & Export",
                    R.drawable.ic_action_import_export));
        dataList.add(new DrawerItem("About", R.drawable.ic_action_about));
        dataList.add(new DrawerItem("Settings", R.drawable.ic_action_settings));
        dataList.add(new DrawerItem("Help", R.drawable.ic_action_help));

        adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
                    dataList);

        mDrawerList.setAdapter(adapter);

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.ic_drawer, R.string.drawer_open,
                    R.string.drawer_close) {
              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) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
  }

  public void goToWallpaper (View view) {
        Intent intent = new Intent(this, Wallpaper.class);
        startActivity(intent);
  }

  public void SelectItem(int position) {

        Fragment fragment = null;
        Bundle args = new Bundle();
        switch (position) {
        case 0:
              fragment = new FragmentOne();
              break;
        case 1:
              fragment = new FragmentTwo();
              break;
        case 2:
              fragment = new FragmentThree();
              break;
        case 3:
              fragment = new FragmentFour();
              break;
        case 4:
              startActivity(new Intent(this, Wallpaper.class));
              break;
        default:
              break;
        }

        fragment.setArguments(args);
        FragmentManager frgManager = getFragmentManager();
        frgManager.beginTransaction().replace(R.id.content_frame, fragment)
                    .commit();

        mDrawerList.setItemChecked(position, true);
        setTitle(dataList.get(position).getItemName());
        mDrawerLayout.closeDrawer(mDrawerList);

  }

  @Override
  public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
  }

  @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 toggles
        mDrawerToggle.onConfigurationChanged(newConfig);
  }

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

        return false;
  }

    private class DrawerItemClickListener implements
              ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
              SelectItem(position);

        }
  }
公共类MainActivity扩展活动{
私人抽屉布局mDrawerLayout;
私有列表视图mDrawerList;
私有操作bardrawertoggle mDrawerToggle;
私有字符序列mDrawerTitle;
私有字符序列mTitle;
雷达适配器;
列表数据列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
dataList=newarraylist();
mTitle=mDrawerTitle=getTitle();
mDrawerLayout=(抽屉布局)findViewById(R.id.抽屉布局);
mDrawerList=(ListView)findViewById(R.id.left\u抽屉);
mDrawerLayout.setDrawerShadow(R.drawable.DrawerShadow,
重力比较(启动);
//将抽屉项添加到数据列表
添加(新的DrawerItem(“启动器”,R.drawable.ic_action_email));
添加(新的付款人(“额外的”,R.drawable.ic_action_good));
添加(新的DrawerItem(“Support”,R.drawable.ic_action_gamepad));
添加(新的付款人标签(“联系人”,R.drawable.ic_action_标签));
添加(新抽屉(“墙纸”,R.drawable.ic_action_search));
添加(新的“导入和导出”,
R.drawable.ic_action_import_export));
添加(新的DrawerItem(“About”,R.drawable.ic_action_About));
添加(新的抽屉属性(“设置”,R.drawable.ic_action_设置));
添加(新的DrawerItem(“Help”,R.drawable.ic_action_Help));
适配器=新的CustomDrawerRadepter(此,R.layout.custom_抽屉项目,
数据表);
mDrawerList.setAdapter(适配器);
setOnItemClickListener(新的DrawerItemClickListener());
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawerToggle=新操作BarDrawerToggle(此,mDrawerLayout,
R.drawable.ic_抽屉,R.string.drawer_抽屉打开,
右弦抽屉(U关闭){
公共无效onDrawerClosed(视图){
getActionBar().setTitle(mTitle);
InvalidateOptions菜单();//创建对的调用
//onPrepareOptions菜单()
}
打开图纸上的公共空白(视图抽屉视图){
getActionBar().setTitle(mDrawerTitle);
InvalidateOptions菜单();//创建对的调用
//onPrepareOptions菜单()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
如果(savedInstanceState==null){
选择项目(0);
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
公共作废goToWallpaper(视图){
意向意向=新意向(此,Wallpaper.class);
星触觉(意向);
}
public void SelectItem(内部位置){
片段=空;
Bundle args=新Bundle();
开关(位置){
案例0:
fragment=新的FragmentOne();
打破
案例1:
fragment=新的FragmentTwo();
打破
案例2:
fragment=新的FragmentThree();
打破
案例3:
fragment=新的FragmentFour();
打破
案例4:
startActivity(新意图(此,Wallpaper.class));
打破
违约:
打破
}
fragment.setArguments(args);
FragmentManager frgManager=getFragmentManager();
frgManager.beginTransaction().replace(R.id.content\u框架,片段)
.commit();
mDrawerList.setItemChecked(位置,true);
setTitle(dataList.get(position.getItemName());
mDrawerLayout.closeDrawer(mDrawerList);
}
@凌驾
公共无效设置标题(字符序列标题){
mTitle=标题;
getActionBar().setTitle(mTitle);
}
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
//在onRestoreInstanceState发生后同步切换状态。
mDrawerToggle.syncState();
}
@凌驾
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
//将任何配置更改传递给抽屉开关
mDrawerToggle.onConfigurationChanged(newConfig);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//操作栏home/up操作应打开或关闭抽屉。
//ActionBarDrawerToggle会处理好的。
如果(MDRAWERTOGLE.onOptionsItemSelected(项目)){
返回true;
}
返回false;
}
私有类DrawerItemClickListener实现
ListView.com侦听器{
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
选择项目(位置);
}
}
}

这是墙纸活动:

public class Wallpaper extends SherlockActivity implements AdapterView.OnItemSelectedListener,
    OnClickListener {

private Gallery mGallery;
private ImageView mImageView;
private boolean mIsWallpaperSet;

private Bitmap mBitmap;

private ArrayList<Integer> mThumbs;
private ArrayList<Integer> mImages;
private WallpaperLoader mLoader;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    findWallpapers();

    setContentView(R.layout.wallpaper_chooser);

    mGallery = (Gallery) findViewById(R.id.gallery);
    mGallery.setAdapter(new ImageAdapter(this));
    mGallery.setOnItemSelectedListener(this);
    mGallery.setCallbackDuringFling(false);

    findViewById(R.id.set).setOnClickListener(this);

    mImageView = (ImageView) findViewById(R.id.wallpaper);
}

private void findWallpapers() {
    mThumbs = new ArrayList<Integer>(24);
    mImages = new ArrayList<Integer>(24);

    final Resources resources = getResources();
    final String packageName = getApplication().getPackageName();

    addWallpapers(resources, packageName, R.array.wallpapers);
    addWallpapers(resources, packageName, R.array.extra_wallpapers);
}

private void addWallpapers(Resources resources, String packageName, int list) {
    final String[] extras = resources.getStringArray(list);
    for (String extra : extras) {
        int res = resources.getIdentifier(extra, "drawable", packageName);
        if (res != 0) {
            final int thumbRes = resources.getIdentifier(extra + "_small",
                    "drawable", packageName);

            if (thumbRes != 0) {
                mThumbs.add(thumbRes);
                mImages.add(res);
            }
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    mIsWallpaperSet = false;
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
        mLoader.cancel(true);
        mLoader = null;
    }
}

@Override
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
        mLoader.cancel();
    }
    mLoader = (WallpaperLoader) new WallpaperLoader().execute(position);
}

private void selectWallpaper(int position) {
    if (mIsWallpaperSet) {
        return;
    }

    mIsWallpaperSet = true;
    try {
        InputStream stream = getResources().openRawResource(mImages.get(position));
        setWallpaper(stream);
        setResult(RESULT_OK);
        finish();
    } catch (IOException e) {
        Log.e("Template", "Failed to set wallpaper: " + e);
    }
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
}

private class ImageAdapter extends BaseAdapter {
    private LayoutInflater mLayoutInflater;

    ImageAdapter(Wallpaper context) {
        mLayoutInflater = context.getLayoutInflater();
    }

    @Override
    public int getCount() {
        return mThumbs.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView image;

        if (convertView == null) {
            image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
        } else {
            image = (ImageView) convertView;
        }

        int thumbRes = mThumbs.get(position);
        image.setImageResource(thumbRes);
        Drawable thumbDrawable = image.getDrawable();
        if (thumbDrawable != null) {
            thumbDrawable.setDither(true);
        } else {
            Log.e("Template", String.format(
                "Error decoding thumbnail resId=%d for wallpaper #%d",
                thumbRes, position));
        }
        return image;
    }
}

@Override
public void onClick(View v) {
    selectWallpaper(mGallery.getSelectedItemPosition());
}

class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> {
    BitmapFactory.Options mOptions;

    WallpaperLoader() {
        mOptions = new BitmapFactory.Options();
        mOptions.inDither = false;
        mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;            
    }

    @Override
    protected Bitmap doInBackground(Integer... params) {
        if (isCancelled()) return null;
        try {
            return BitmapFactory.decodeResource(getResources(),
                    mImages.get(params[0]), mOptions);
        } catch (OutOfMemoryError e) {
            return null;
        }            
    }

    @Override
    protected void onPostExecute(Bitmap b) {
        if (b == null) return;

        if (!isCancelled() && !mOptions.mCancel) {

            if (mBitmap != null) {
                mBitmap.recycle();
            }

            final ImageView view = mImageView;
            view.setImageBitmap(b);

            mBitmap = b;

            final Drawable drawable = view.getDrawable();
            drawable.setFilterBitmap(true);
            drawable.setDither(true);

            view.postInvalidate();

            mLoader = null;
        } else {
           b.recycle(); 
        }
    }

    void cancel() {
        mOptions.requestCancelDecode();
        super.cancel(true);
    }
}
公共类墙纸扩展Sherlock活动实现AdapterView.OnItemSelectedListener,
onclick侦听器{
私人画廊;
私人Imag
Fragment fragment = null;
fragment.setArguments(args);  // If the fragment is null, an Exception will occur
case 4:
   startActivity(new Intent(this, Wallpaper.class));
   break;
if(fragment != null) {
    fragment.setArguments(args);
    FragmentManager frgManager = getFragmentManager();
    frgManager.beginTransaction().replace(R.id.content_frame, fragment)
                .commit();
}