【问题标题】:How to close the navigation drawer when an Item of ListView is selected?选择 ListView 的项目时如何关闭导航抽屉?
【发布时间】:2015-10-23 13:56:03
【问题描述】:

我知道这个问题被问了很多次,但我们有不同的情况。关于项目,我从 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扩展的基础Activity:

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. 如果 onitemclick 定义在 SlidingMenuFragment 类中并且 mDrawerlayout 位于由 MainActivity 类扩展的 BaseActivity 类中,我如何在单击列表视图的项目时关闭抽屉?

【问题讨论】:

  • 抽屉附加到的活动... 您需要访问该活动以便调用关闭或传递活动以便在点击期间可以使用它。也许是一个静态方法或只是传递它,也许是一个处理程序。我假设 frag 中的 getActivity() 得到了错误的活动(或者你没有尝试过)?看起来可能会受益于一个更精致的问题......标题有点误导,即使这是所需要的结束(它不是你真正需要的)。
  • 啊,好吧,先生.. 对不起。不过感谢您的回复。

标签: java android eclipse android-fragments


【解决方案1】:

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

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

内部片段

 MainActivity.closeDrawer();

【讨论】:

  • 感谢您的回复先生!
  • 我不能投票,先生,因为我的声誉不是 15 很抱歉
【解决方案2】:

这是我的建议: 在 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);
}
}`

【讨论】:

  • 先生,什么是 MainFragment()?我真的很抱歉我是 android 新手。
  • 我放的代码是你在问题中给出的代码,我只是参考它们来告诉你解决问题的方法,你可以在你的项目中找到 MainFragment。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多