如何在选择ListView项时关闭导航抽屉?

时间:2015-10-23 02:25:25

标签: java android eclipse android-fragments

我知道这个问题被多次询问,但我们有不同的情况。关于该项目,我从GitHub.com下载了项目导航抽屉演示。提供以下代码: 这是主要活动:

package edu.ejapp.dotalegitstore;



@SuppressLint("NewApi") 
public class MainActivity extends BaseActivity {
FragmentStackManager fm,sliding_menu;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    context=this;
    setUpView();
    menuToggeleSetUp(savedInstanceState);
}

void setUpView(){
    fm              = new FragmentStackManager(this);
    sliding_menu    = new FragmentStackManager(this);
    drawer     = (DrawerLayout) findViewById(R.id.drawer_layout);
    fm.addFragment(new MainFragment(), R.id.main_frame, false, FragmentTransaction.TRANSIT_NONE, false);
    sliding_menu.addFragment(new SlidingMenuFragment(), R.id.slide_fragment, false, FragmentTransaction.TRANSIT_NONE, false);
}

void menuToggeleSetUp(Bundle savedInstanceState){
    mDrawerToggle = new ActionBarDrawerToggle(this, drawer,
            R.drawable.ic_drawer, // nav menu toggle icon
            R.string.app_name
    ) {
        @SuppressLint("NewApi") 
        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
            // calling onPrepareOptionsMenu() to show action bar icons
            invalidateOptionsMenu();
        }

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

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

    }
}
@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();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    if (id == R.id.action_settings) {
        return true;
    }
    else if (id == R.id.action_exit) {
        final AlertDialog.Builder dialog = new AlertDialog.Builder(context);
        dialog.setTitle("COnfirm exit");
        dialog.setMessage("Are you sure you want to exit?");
        dialog.setPositiveButton("No", new DialogInterface.OnClickListener()         {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        });
        dialog.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                finish();
            }
        });

        AlertDialog alertDialog = dialog.create();
        alertDialog.show();

    }
    else if (id == R.id.action_login) {
        startActivity(new Intent(MainActivity.this, LoginActivity.class));
    }
    else {

    }

    return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}
}

MainActivity扩展的基本活动:

package edu.ejapp.dotalegitstore;

import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;

@SuppressWarnings("deprecation")
public class BaseActivity extends ActionBarActivity{
public ActionBarDrawerToggle mDrawerToggle;
public DrawerLayout drawer;

CharSequence mDrawerTitle;
CharSequence mTitle;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setActionBar();
}
public void setActionBar(){
    getSupportActionBar().setTitle("");
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(this.getResources().getColor(R.color.app_main)));
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
}

}

最后滑动片段活动,这里的项目点击不是在baseactivity或main中实现的,这是我的问题的原因:当我点击抽屉上的项目时,我无法关闭抽屉:

public class SlidingMenuFragment extends Fragment {
List<String> data;
ListView list_view;
SlidingMenuListAdapter adapter;

@SuppressLint("InflateParams")
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_sliding_menu, null);
    setUpView(root);
    return root;
}
void setUpView(ViewGroup root){
    list_view  =  (ListView)root.findViewById(R.id.list_view);
    initList();
    setUpClick();
}
void initList(){
    data = new ArrayList<String>();

    data.add("Home");
    data.add("Arcana");
    data.add("Courrier");
    data.add("Hero Sets");
    data.add("Immortals");

    adapter = new SlidingMenuListAdapter(getActivity(),data);
    list_view.setAdapter(adapter);

}
void setUpClick(){
    list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getActivity(),"Hi "+position,Toast.LENGTH_SHORT).show();

            }
        });
}
}

我没有包含其他文件,例如xmls。我的问题是:

  1. 如果在SlidingMenuFragment类中定义了onitemclick并且mDrawerlayout位于由MainActivity类扩展的BaseActivity类中,我单击列表视图的项目时如何关闭抽屉?

2 个答案:

答案 0 :(得分:1)

创建一个方法来关闭主活动中的抽屉并从片段中调用它。

public static void closeDrawer(){
    if(drawerLayout.isDrawerOpen(leftDrawerList)){
        drawerLayout.closeDrawer(leftDrawerList);
    }
}

内部碎片

 MainActivity.closeDrawer();

答案 1 :(得分:0)

这是我的建议: 在SlidingMenuFragment中提供一个接口,如:

public class SlidingMenuFragment extends Fragment {
            private OnListItemClickListener mOnListItemClickListener;
            //here is mOnListItemClickListener getter and setter method
            public *** set(get)OnListItemClickListener(){};
            //define a interface here
            public interface OnListItemClickListener{
                public void onListenItemClick();
            }
            .
            .
            .
        void setUpClick(){
            list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                           if(mOnListItemClickListener != null){
                               mOnListItemClickListener.onListenItemClick();
                           }

                    }
                });
        }
        }

然后你应该在MainActivity类中实现这个接口,如:

  public class MainActivity extends BaseActivity {
    void setUpView(){
        fm              = new FragmentStackManager(this);
        sliding_menu    = new FragmentStackManager(this);
        drawer     = (DrawerLayout) findViewById(R.id.drawer_layout);
        fm.addFragment(new MainFragment(), R.id.main_frame, false, FragmentTransaction.TRANSIT_NONE, false);
     SlidingMenuFragment smFragment = new SlidingMenuFragment()
    smFragment.setMonListItemClickListener(new OnListItemClickListener(){
    public void onListenItemClick(){
    drawer.close();
    }
    });
    sliding_menu.addFragment(smFragment, R.id.slide_fragment, false, FragmentTransaction.TRANSIT_NONE, false);
}
}`