Android onKeyDown返回主要活动

问题描述:

我是Android新手。我想开发一个功能从片段回到主屏幕退出应用程序,但它不起作用。目前一旦我按下了按钮,它会提示退出应用程序。如何回到主要活动从onKeyDown退出应用程序?Android onKeyDown返回主要活动

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener, FragmentFlickrGridImage.OnFragmentInteractionListener 
    { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    if (savedInstanceState == null) { 
     Fragment fragment = null; 
     Class fragmentClass = null; 
     fragment = new MyFragment("0"); 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 
    } 


    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.setItemIconTintList(null); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@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 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.share) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    Fragment fragment = null; 
    Class fragmentClass = null; 
    String title=""; 

    if (id == R.id.one) { 
     fragment = new MyFragment("1"); 
     title="One"; 
    } else if (id == R.id.two) { 
     fragment = new MyFragment("2"); 
     title ="two"; 
    } else if (id == R.id.three) { 
     fragment = new MyFragment("3"); 
     title="three"; 
    } 

    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 
    getSupportActionBar().setTitle(title); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

@Override 
public void onFragmentInteraction(Uri uri) { 

} 
// confirm when user click back key 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode != KeyEvent.KEYCODE_BACK) return super.onKeyDown(keyCode, event); 

    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) { 
      switch (which){ 
       case DialogInterface.BUTTON_POSITIVE: 
        //Yes button clicked 
        finish(); 
        break; 

       case DialogInterface.BUTTON_NEGATIVE: 
        //No button clicked 
        break; 
      } 
     } 
    }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(this) 
      .setMessage("Are you sure?") 
      .setPositiveButton("Yes", dialogClickListener) 
      .setNegativeButton("No", dialogClickListener) 
      .setCancelable(false) 
      .setTitle("Exit"); 
    builder.show(); 

    return super.onKeyDown(keyCode, event); 
} 

下面)的错误代码,我得到了落实addtobackstack

Application is not responding: AppWindowToken{bcc0a65 token=Token{1a7f775c ActivityRecord{3ccf31cf u0 com.google.android.googlequicksearchbox/com.google.android.launcher.GEL t310}}}. It has been 5010.0ms since event, 5010.0ms since wait started. 
Reason: Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up. 
+0

通过由http://*.com给出以下解决方案/ questions/32944798 /切换片段与onnavigationitem选择在新的导航,抽屉适用于我:) – michelletbs

尝试拨打您的onBackPressed方法中的。包裹的逻辑来检查片段是您想要从解决此退出在我的答案对这个问题method.Take一看:

Switch between Fragments with onNavigationItemSelected in new Navigation Drawer Activity template (Android Studio 1.4 onward)

+0

是的,它适用于我。谢谢! – michelletbs

时虽然更换片段添加fragmentManager.addToBackStack(null);

FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment); 
    fragmentManager.addToBackStack(null); 
    fragmentManager.commit(); 

通过调用addToBackStack(,替换事务被保存到因此用户可以通过按下“后退”按钮来反转事务并恢复以前的片段。

并在您的主要活动/首页动态此改变onBackPressed()

public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
    // Add your Dialogue or whatever to alert 
     moveTaskToBack(true); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public void onBackPressed() { 

     super.onBackPressed(); 
     onKeyDown(KeyEvent.KEYCODE_BACK, null); 
    } 
+0

我已经在模拟器中测试,但失败。这里是错误代码:“由于没有窗口焦点而取消事件。”这是模拟器的问题? – michelletbs

+0

试用真实设备 –

+0

我已经在真实设备上测试过。它会直接从片段中退出。但我想要的是从片段,回到主屏幕,然后只退出...嗯... – michelletbs

下面是我的解决办法

定义一个名为backstact_count节省更换fragments数量变量。

您需要添加当前fragmentbackstack当您通过另一个

public void replaceFragment(Fragment fragment, boolean isAddToBackStack) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.flContent, fragment); 
    if (isAddToBackStack) { 
     transaction.addToBackStack(fragment.getClass().toString()); 
     backstack_count ++; 
    } 
    transaction.commit(); 
} 

更换然后覆盖onBackPressed()

@Override 
    public void onBackPressed() { 
if (backstack_count > 0) { 
      FragmentManager manager = getSupportFragmentManager(); 
      manager.popBackStack(); 
      backstack_count--; 
     } else { 
      super.onBackPressed(); 
     } 
    } 

最后,编辑你的onCreate取代片段()作为如下:

replaceFragment(fragment, true); 
+0

我已经在onCreate fragmentManager.beginTransaction()中添加了这行代码替换(R.id.flContent,片段)。承诺();想问我应该用replaceFragment(fragment,true)替换这行代码? – michelletbs

+0

是的,你应该。所有你需要的是调用replaceFragment(fragment,true);所以你的代码将会是: try { fragment =(Fragment)fragmentClass.newInstance(); (例外e){ e.printStackTrace(); } replaceFragment(fragment,true); –

+0

我在模拟器中尝试过,应用程序没有响应错误消息:“由于没有窗口焦点而取消事件”。你知道这个错误是什么意思吗? – michelletbs