Android 扩展到其他类时,导航抽屉将不会打开

Android 扩展到其他类时,导航抽屉将不会打开,android,drawer,Android,Drawer,我正在将我的NavigationObject类扩展到我的其他活动类,但当我单击菜单时,抽屉不会出现 这是我的导航对象: public class NavigationObject extends ActionBarActivity implements OnClickListener{ private DrawerLayout mDrawerLayout; private ArrayAdapter<String> mAdapter; private ActionBarDrawerTo

我正在将我的NavigationObject类扩展到我的其他活动类,但当我单击菜单时,抽屉不会出现

这是我的导航对象:

public class NavigationObject extends ActionBarActivity implements OnClickListener{
private DrawerLayout mDrawerLayout;
private ArrayAdapter<String> mAdapter;
private ActionBarDrawerToggle mDrawerToggle;
private String mActivityTitle;
ListView listView;
List<RowItem> rowItems;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Firebase.setAndroidContext(this);
    setContentView(R.layout.navdrawer); 

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    mActivityTitle = getTitle().toString();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setIcon(R.drawable.ic_launcher);
    System.out.println("ERROR 1");
    addDrawerItems();
    setupDrawer();
  } 


public boolean onCreateOptionsMenu(Menu menu) {      
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
    return super.onCreateOptionsMenu(menu);
  }


//junk
   public void addDrawerItems() {
   System.out.println("ERROR 2");
    String[] drawer_Array = { "User Profile", "Setting", "Contact us", "Help", "Logout" };
    String[] desc_Array = { "Private", "Change settings", "Ask us anything", "Simple Guide", "Logs out user" };
    Integer[] image_Array = { R.drawable.user, R.drawable.setting, R.drawable.contactme, R.drawable.help, R.drawable.logout };

    //mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, drawer_Array);
    //mDrawerList.setAdapter(mAdapter);
    rowItems = new ArrayList<RowItem>();
    for (int i = 0; i < drawer_Array.length; i++) {
        RowItem item = new RowItem(image_Array[i], drawer_Array[i], desc_Array[i]);
        rowItems.add(item);
    }
    System.out.println("ERROR 3");
    listView = (ListView) findViewById(R.id.navList);
    CustomDrawerBaseAdapter adapter = new CustomDrawerBaseAdapter(this, rowItems);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position == 0){
                Intent toProfile = new Intent(getApplicationContext(), userprofActivity.class);
                startActivity(toProfile);
                //Toast.makeText(getMsgActivity.this, "Time for an upgrade!", Toast.LENGTH_SHORT).show();   
            }
            else if(position == 1){
                //Toast.makeText(getMsgActivity.this, "Time for an Wake!", Toast.LENGTH_SHORT).show();
            }
            else if(position == 2){
                //Toast.makeText(getMsgActivity.this, "Time for an Eat!", Toast.LENGTH_SHORT).show();
            }
            else if(position == 3){
                //Toast.makeText(getMsgActivity.this, "Time for an Dance!", Toast.LENGTH_SHORT).show();
            }
            else if(position == 4){
                //Toast.makeText(getMsgActivity.this, "Time for an Sleep!", Toast.LENGTH_SHORT).show();
            }   
        }
    });

    System.out.println("ERROR 4");
  }

     public void setupDrawer() {
        //getActionBar().setDisplayHomeAsUpEnabled(true);
        //getActionBar().setHomeButtonEnabled(true);
   System.out.println("ERROR 5");
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {

            // enabling action bar app icon and behaving it as toggle button

                public void onDrawerOpened(View drawerView) {
                    System.out.println("ERROR 5");
                    super.onDrawerOpened(drawerView);
                    listView.bringToFront();
                    mDrawerLayout.requestLayout();
                    getSupportActionBar().setTitle("User Menu Option");
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }

                public void onDrawerClosed(View view) {
                    System.out.println("ERROR 6");
                    super.onDrawerClosed(view);
                    getSupportActionBar().setTitle(mActivityTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
        };
        System.out.println("ERROR 6.5");
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

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

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        System.out.println("ERROR 7");
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(listView);
        menu.findItem(R.id.action_write).setVisible(!drawerOpen);
        menu.findItem(R.id.action_grabmsg).setVisible(!drawerOpen);
        menu.findItem(R.id.action_mydiary).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }



    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            System.out.println("landscape");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            System.out.println("portrait");
        }
    } 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //bundle = getIntent().getExtras();
        //String language_chosen = bundle.getString("lang_pick");

        if (id == R.id.action_write) {
            Intent writeNewMsg = new Intent(getApplicationContext(), writeMsgActivity.class);
            //writeNewMsg.putExtra("lang_pick", language_chosen);
            startActivity(writeNewMsg);
        }
        else if(id == R.id.action_grabmsg){
            Intent grabNewMsg = new Intent(getApplicationContext(), getMsgActivity.class);
            //grabNewMsg.putExtra("lang_pick", language_chosen);
            finish();
            startActivity(grabNewMsg);

        }
        else if(id == R.id.action_mydiary){

        }

        // Activate the navigation drawer toggle
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            System.out.println("ERROR 8"); //This is where the error is. It is returned but never used.
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}
在这里,这些方法从未被调用:

                    public void onDrawerOpened(View drawerView) {
                    System.out.println("ERROR 5.5");
                    super.onDrawerOpened(drawerView);
                    listView.bringToFront();
                    mDrawerLayout.requestLayout();
                    getSupportActionBar().setTitle("User Menu Option");
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }

                public void onDrawerClosed(View view) {
                    System.out.println("ERROR 6");
                    super.onDrawerClosed(view);
                    getSupportActionBar().setTitle(mActivityTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
以下是NavigationObject类中名为navdrawer.xml的抽屉的xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ListView
    android:id="@+id/navList"
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:background="#ffeeeeee"/> 

</android.support.v4.widget.DrawerLayout>
问题:每次单击抽屉上的选项菜单栏时,它都会从NavigationObject类打印“8”,但之后它什么也不做。代码中没有错误,因为除了system.out.println(“错误5.5”)和system.out.println(“错误6”)用于打开和关闭抽屉外,我放置的所有系统输出都工作正常。刷卡不起作用

当我将所有NavigationObject类推到MainActivity类中时,这是有效的,但现在当我将抽屉作为单独的类(NavigationObject类)进行继承时,它就不起作用了

菜单栏工作正常。但是在“错误8”中选择的选项不会返回任何内容,但仍会打印出来,因此它可以工作,但也不会执行任何操作


非常感谢您的帮助,这是我最后一年的项目,很快就会到期:)。

您在派生类中设置了不同的布局(R.layout.get_msg)。此布局是否包含NavigationDrawer?如果没有,那就是你的错误

编辑

尝试以下操作:将NavigationDrawer的初始化移动到基本活动中的单独方法,如下所示:

public class NavigationObject extends ActionBarActivity ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Firebase.setAndroidContext(this);
}

protected void initNavigationDrawer() {
    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    mActivityTitle = getTitle().toString();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setIcon(R.drawable.ic_launcher);
    System.out.println("ERROR 1");
    addDrawerItems();
    setupDrawer();
} 
在MainActivity中,在设置内容视图后,在onCreate()方法中调用init方法

public class MainActivity extends NavigationObject ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.get_msg); // <-- must contain drawer_layout
    initNavigationDrawer();
}
公共类MainActivity扩展了NavigationObject。。。
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.get_msg);//当你从左边滑动时,菜单是否打开?是的,但它是纯白色的。我也有同样的问题。我会在修复它时返回给你。我解决了我的问题。它来自子类。在子类中设置contentView之前,我正在调用我的超类的setup方法。你能发布你的子类代码吗?特别是在你e onCreate方法?我只是通过继承将对象类扩展到我的其他活动类。我在编辑中放置了一段代码以显示扩展。不,我没有将其放入。我是从NavigationObject继承来使用navdrawer.xml的,因此这种方法不起作用。因此,您建议我将抽屉的xml放在get_msg.xml中而不是它自己的xml(navdrawer),但我已经尝试过了,当我滑动它时,它会工作,但显示为纯白色,并且菜单上选项Select上的抽屉不会打开抽屉。这就是你建议的,我想,我在NavigationObject类中设置
setContentView(R.layout.get_msg);
,而不是
setContentView(R.layout.navdrawer);
。我还将navdrawer.xml中的drawer添加到get_msg.xml中。您必须了解,在派生类中调用setContentView时,您将替换以前在基类中设置的布局。我建议不要使用setContentView()在基类中,但在所有派生类中都有抽屉布局。在派生类中,在setContentView()之后调用super.onCreate(),因此当基类执行
findViewById(R.id.drawer\u布局)时,导航抽屉实际上有一个布局
基类也可以添加导航项。从我的基类中删除xml后,错误出现在
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
它没有告诉我错误,但当我更改您所说的“在setContentView()之后调用super.onCreate()”:
setContentView(R.layout.get\u msg);super.onCreate(savedInstanceState);Firebase.setAndroidContext(this);
如果我没有更改您所说的内容并保持原样(但在基类中删除了xml),它将在
listView.setAdapter(adapter);
处给我一个错误,但没有任何发生错误的详细信息。
public class NavigationObject extends ActionBarActivity ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Firebase.setAndroidContext(this);
}

protected void initNavigationDrawer() {
    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    mActivityTitle = getTitle().toString();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setIcon(R.drawable.ic_launcher);
    System.out.println("ERROR 1");
    addDrawerItems();
    setupDrawer();
} 
public class MainActivity extends NavigationObject ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.get_msg); // <-- must contain drawer_layout
    initNavigationDrawer();
}