【问题标题】:onBackPressed() method doesn't work as expected in Android Navigartion DraweronBackPressed() 方法在 Android 导航抽屉中无法按预期工作
【发布时间】:2015-12-15 19:12:45
【问题描述】:

我正在尝试实现 android 导航抽屉。问题出在我的 onBackPressed() 方法上。当按下后退按钮时,它会重定向到我的 MainActivity。但我想用它从我的当前页面转到上一页。 我尝试了很多但做不到。我的 logCat 没有错误。

所以我的 onBackPressed() 是这样的

@Override
public void onBackPressed() {
    Intent i=new Intent(MainActivity.this,MainActivity.class);
    startActivity(i);
    return;
}

所以现在如何解决我的问题。 对于您的理解,有我的 MainActivity 代码

package spurs.cafesoft.travelersguide;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import spurs.cafesoft.travelersguide.fragment.Fragment_barishal;
import spurs.cafesoft.travelersguide.fragment.Fragment_chittagong;
import spurs.cafesoft.travelersguide.fragment.Fragment_dhaka;
import spurs.cafesoft.travelersguide.fragment.Fragment_home;
import spurs.cafesoft.travelersguide.fragment.Fragment_khulna;
import spurs.cafesoft.travelersguide.fragment.Fragment_main;
import spurs.cafesoft.travelersguide.fragment.Fragment_mymensingh;
import spurs.cafesoft.travelersguide.fragment.Fragment_rajshahi;
import spurs.cafesoft.travelersguide.fragment.Fragment_rangpur;
import spurs.cafesoft.travelersguide.fragment.Fragment_sylhet;

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "ns.nayem350@gmail.com", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);


    FragmentManager fm = getFragmentManager();
    fm.beginTransaction().replace(R.id.frame_layout, new Fragment_main()).commit();
}

@Override
public void onBackPressed() {
    Intent i=new Intent(MainActivity.this,MainActivity.class);
    startActivity(i);
    return;
}

@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;
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.

    FragmentManager fm =getFragmentManager();

    int id = item.getItemId();
    if (id==R.id.home){
        fm.beginTransaction().replace(R.id.frame_layout,new Fragment_home()).commit();
    }

    else if (id == R.id.dhaka) {

        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_dhaka()).commit();

    } else if (id == R.id.chittagong) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_chittagong()).commit();

    } else if (id == R.id.barishal) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_barishal()).commit();
    } else if (id == R.id.rajshahi) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_rajshahi()).commit();

    } else if (id == R.id.khulna) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_khulna()).commit();

    } else if (id == R.id.sylhet) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_sylhet()).commit();
    }else if (id == R.id.rangpur) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_rangpur()).commit();

    }else if (id == R.id.mymensingh) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_mymensingh()).commit();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
}

【问题讨论】:

    标签: java android back-button navigation-drawer onbackpressed


    【解决方案1】:

    您必须在替换片段时将事务添加到 backstack。这样您就不需要自定义 onBackPressed 代码,它应该可以正常工作。

    backstack 是 android 系统用来导航回以前的系统状态的堆栈,这是人们按下后退按钮时想要的。

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();    
    

    使用您的代码的示例

     fm.beginTransaction().replace(R.id.frame_layout, new Fragment_mymensingh()).addToBackStack(null).commit();
    

    【讨论】:

    • 它说FragmentTransiction中的addTobackStack()不能应用。可能是一件愚蠢的事情,但我是菜鸟,请帮助我做什么。
    • @TanvirDurlove 抱歉,您需要给它一个标签参数,该参数只能为空。查看更新的答案。
    • 你得到了什么确切的错误?您是否也尝试过像第一个示例一样使用 4 行,而不是一行中的所有内容?
    • 非常感谢您的回答。我得到它解决问题,因为你是解决方案。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多