2017-04-13 75 views
0

我有一个简单的应用程序。它由活动A和活动B组成。Android向上按钮不起作用

当我从活动A(从启动器图标)开始,然后导航到活动B,然后点击向上按钮。我到达活动A.完美。

然而,当我从命令行(模拟另一个应用程序或通知开始该活动)开始活动B并且我点击向上按钮时,我就进入主屏幕。

这里是我的设置:

活动A

public class ActivityA extends AppCompatActivity { 

    @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) { 
       Intent intent = new Intent(ActivityA.this, ActivityB.class); 
       startActivity(intent); 
      } 
     }); 

    } 


} 

活动B

public class ActivityB extends AppCompatActivity { 

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

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
} 

我的清单。请注意,父活动已定义,我的app min api为16(因此父活动声明对于16岁及以上有效)。

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".ActivityA" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".ActivityB" 
      android:exported="true" 
      android:label="@string/title_activity_b" 
      android:parentActivityName=".ActivityA" 
      android:theme="@style/AppTheme.NoActionBar" /> 
    </application> 

从CMD行启动ActivityB我用:adb shell am start com.example.demo/com.example.demo.ActivityB

编辑1

根据文档在这里:https://developer.android.com/training/appbar/up-action.html

你并不需要赶上后续行动在活动的 onOptionsItemSelected()方法中。相反,该方法应该调用其超类,如响应操作所示。超类方法 通过导航到父活动来响应Up选择,如应用清单中指定的 。

编辑2:

只是踢,我想这两个代码片段在这里。一次一个,看看他们是否会做到这一点。但他们没有。 ActivityA未打开。 ActivityB关闭。

https://developer.android.com/training/implementing-navigation/ancestral.html

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
     NavUtils.navigateUpFromSameTask(this); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
     Intent upIntent = NavUtils.getParentActivityIntent(this); 
     if (NavUtils.shouldUpRecreateTask(this, upIntent)) { 
      // This activity is NOT part of this app's task, so create a new task 
      // when navigating up, with a synthesized back stack. 
      TaskStackBuilder.create(this) 
        // Add all of this activity's parents to the back stack 
        .addNextIntentWithParentStack(upIntent) 
        // Navigate up to the closest parent 
        .startActivities(); 
     } else { 
      // This activity is part of this app's task, so simply 
      // navigate up to the logical parent activity. 
      NavUtils.navigateUpTo(this, upIntent); 
     } 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

发生了什么事VS预期? 当我通过cmd行打开ActivityB并点击时,我期望在ActivityB关闭时进入ActivityA。实际发生的是ActivityB刚关闭。

+0

'onOptionsItemSelected'未执行https://developer.android.com/training/implementing-navigation/ancestral。html –

+0

根据文档。 '您不需要在活动的onOptionsItemSelected()方法中捕获向上动作。相反,该方法应调用其超类,如响应操作所示。按照应用程序清单中指定的方式,超类方法通过导航到父活动来响应Up选项。 – EGHDK

回答

0

这是默认行为,向上导航按钮与Activity Stack一起使用,如果ActivityA不在堆栈中,则Android将返回到前一屏幕,在这种情况下是主屏幕。

+0

后退按钮应该从堆栈中运行。向上按钮应该带我到我定义的层级中的父级。 – EGHDK

+0

你错了,后退按钮已经与后面堆栈工作.....并且与特定的应用程序无关。向上按钮已与应用程序的层次结构..并与特定的应用程序相关。 –

+0

https://developer.android.com/training/implementing-navigation/temporal.html –