【问题标题】:Action bar Back button not working操作栏后退按钮不起作用
【发布时间】:2014-07-24 20:08:03
【问题描述】:

在这些Android Docs的帮助下。我正在尝试做一个动作栏后退按钮。我得到一个动作栏后退按钮,如下图所示:

输出:

但我的问题是在看完画廊图片后,我按下了action bar back button

然后it is not working。但它必须go back to previous page

下面列出的是编码。

GalleryActivity.java:

    import android.app.ActionBar;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.NavUtils;
    import android.view.MenuItem;

    import com.fth.android.R;

   public class GalleryActivity extends FragmentActivity {

    private int position;
    private static String id;
    private static String name;
    private DemoCollectionPagerAdapter mDemoCollectionPagerAdapter;
    private ViewPager mViewPager;


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

            position = getIntent().getExtras().getInt("position");

            id = getIntent().getExtras().getString("id");

            name = getIntent().getExtras().getString("name");

            mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getSupportFragmentManager());

            // Set up action bar.
            final ActionBar actionBar = getActionBar();


            actionBar.setDisplayHomeAsUpEnabled(true);

           // getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO|ActionBar.DISPLAY_HOME_AS_UP);

            // Set up the ViewPager, attaching the adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mDemoCollectionPagerAdapter);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:

                    Intent upIntent = new Intent(this, HomeActivity.class);
                    upIntent.putExtra("position", position);
                    if (NavUtils.shouldUpRecreateTask(this, upIntent)) {

                        TaskStackBuilder.from(this)
                                .addNextIntent(upIntent)
                                .startActivities();
                        finish();
                    } else {

                        NavUtils.navigateUpTo(this, upIntent);
                    }
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }


      }

GalleryDetailFragment.java:

import com.sit.fth.model.GalleryDetail;
import com.sit.fth.util.APIServiceHandler;
import com.sit.fth.util.AppConstants;
import com.sit.fth.util.AppPromoPager;

public class GalleryDetailFragment extends BaseFragment implements
        PromoPagerListener {


    private TextView countView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        this.setHasOptionsMenu(true);
        id = getArguments().getString("id");
        name = getArguments().getString("name");
        View view = inflater.inflate(R.layout.app_pager, null);



        return view;
    }

}

如果你知道如何解决这些问题,任何人都可以帮助我。谢谢。

【问题讨论】:

  • 你试过在 AndroidManifest 中声明 ParentActivity 吗?
  • @x90 检查我编辑的帖子。
  • 您确定要将 android:parentActivityName="com.sit.fth.activity.HomeActivity" 定义为 com.sit.fth.activity.HomeActivity 吗?例如,您应该将 HomeActivity 定义为 GalleryActivity 的父活动。不是对自己。
  • @x90 HomeActivity 是一个 mainActivity(Parent Activity)

标签: android android-actionbar


【解决方案1】:

我通过在GalleryActivity 中添加以下编码解决了这些问题。

ActionBar actionBar;
actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) {
        case android.R.id.home: 
            onBackPressed();
            return true;
        }

    return super.onOptionsItemSelected(item);
}

MainActivity中:

以前,

公共类 HomeActivity 扩展 BaseActivity

那我换成

公共类 HomeActivity 扩展了 FragmentActivity

GalleryFragment:

我使用Intent 将其传递给GalleryActivity

@Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Gallery gallery = (Gallery) arg0.getAdapter().getItem(arg2);

        Intent intent = new Intent(getActivity(), GalleryActivity.class);
        intent.putExtra("position", position);
        intent.putExtra("id", gallery.getGalId());
        intent.putExtra("name", gallery.getAlbumTitle());
        startActivity(intent);

        // mCallback.OnGalItemSelected(gallery.getGalId(),gallery.getAlbumTitle());
    } 

【讨论】:

  • 看准了! onBackPressed 正是我想要的。我的一个设置屏幕从几个屏幕打开,我想回到打开它的同一个活动。在 android 活动的上下文中,这个特殊的 id android.R.id.home 是什么?
  • @RBT 向上导航到父 Activity(developer.android.com/training/implementing-navigation/…)。请阅读。
  • 不建议在 OptionsMenu 的 home 操作中使用 onBackPressed:向上按钮(左上角的后退箭头)用于根据屏幕之间的层次关系在应用程序内导航,系统后退按钮用于按时间倒序浏览用户最近使用过的屏幕的历史记录。你可以在这里阅读更多:developer.android.com/design/patterns/navigation.html
【解决方案2】:

请阅读this

你应该有这样的东西:

    <activity
        android:name="com.sit.fth.activity.HomeActivity"
        android:screenOrientation="portrait">

    </activity>
    <activity
        android:name="com.sit.fth.activity.GalleryActivity"
        android:screenOrientation="portrait"
        android:parentActivityName="com.sit.fth.activity.HomeActivity">

    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.sit.fth.activity.HomeActivity"/>

   </activity>


然后调用 NavUtils.navigateUpFromSameTask(this) 将导致导航到父活动 (HomeActivity)。

【讨论】:

  • @Stephen 空闲在哪里?而且我仍然不明白您要从哪个活动导航到哪个活动。
  • Gallery Detail FragmentGallery Activity。我也在图片中显示
  • @Stephen GalleryDetailFragment 托管在哪个活动中?
  • @Stephen 我明白了。但是每个片段都应该托管/附加/连接/属于 Activity。我在问你的片段属于哪个活动。
【解决方案3】:

您需要在 onCreate 方法中调用 setDisplayHomeAsUpEnabled(true) 方法并覆盖 onSupportNavigateUp() 并在其中调用 onBackPressed() 作为以下。而已。完成:)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_help);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

【讨论】:

  • 为什么?我对其进行了测试,仅将 android:parentActivityName=".activities.MainActivity" 添加到清单中,并且使用我测试过的这台设备就足够了。
  • 虽然这可行,但在手动调用onBackPressed 之前,请仔细检查您是否为您的活动设置了android:parentActivityName。见stackoverflow.com/a/24033351/1563833
  • 对于 Kotin:覆盖 fun onSupportNavigateUp(): Boolean { onBackPressed() return true }
【解决方案4】:

您只需将以下行添加到 manifest.xml 中的活动。父活动是您要返回的活动。

    android:parentActivityName=".activities.MainActivity"

【讨论】:

    【解决方案5】:

    试试看

    首先你需要在commit()之前使用addToBackStack()作为片段

    @Override
         public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
             // Respond to the action bar's Up/Home button
             case android.R.id.home:
                 if(getSupportFragmentManager().getBackStackEntryCount()>0)
                    getSupportFragmentManager().popBackStack();
                 return true;
             }
             return super.onOptionsItemSelected(item);
         } 
    

    【讨论】:

    • 这是什么,你能解释一下吗?
    【解决方案6】:

    最好和简单的答案是在 Manifest 文件中添加父活动名称,这样 Actionbar 后退按钮将起作用。

    为此,在清单文件的 Activity 标记下使用 android:parentActivityName=".MyCustomParentActivity"

    【讨论】:

      【解决方案7】:

      如果显示主页按钮。您应该通过 onOptionItemSelected fun(在您的情况下为箭头)向主页按钮添加一个操作,默认情况下没有操作。所以它不起作用是完全正常的。请将此乐趣添加到您的活动中:

       override fun onOptionsItemSelected(item: MenuItem): Boolean {
              return when {
                  item.itemId == android.R.id.home -> {
                      finish()
                      true
                  }
                  else -> super.onOptionsItemSelected(item)
              }
          }
      

      【讨论】:

        【解决方案8】:

        这里提供的答案都不适合我。我不得不将switch 放在onMenuItemSelected 方法中。我知道这不是 Android 文档中所述的内容,但它仍然有效,所以我只是想我会把这个留给遇到同样问题的人。我的问题涉及Activity 而不是Fragment,但这应该几乎相同。

        class FooActivity extends Activity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                // ...
        
                getActionBar().setHomeButtonEnabled(true);
                getActionBar().setDisplayHomeAsUpEnabled(true);
            }
        
            @Override
            public boolean onMenuItemSelected(int featureId, MenuItem item) {
                switch (item.getItemId()) {
                    case android.R.id.home:
                        NavUtils.navigateUpFromSameTask(this);
                        return true;
                }
        
                return false;
            }
        }
        

        【讨论】:

          【解决方案9】:

          对我来说,我必须将mDrawerToggle.setToolbarNavigationClickListener(...) 设置为触发后退操作的侦听器。否则它什么也不做。 ActionBarDrawerToggle的源代码是这样的:

          toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              if (mDrawerIndicatorEnabled) {
                toggle();
              } else if (mToolbarNavigationClickListener != null) {
                mToolbarNavigationClickListener.onClick(v);
              }
            }
          });
          

          所以默认行为实际上是调用我们的监听器,而不是自己做任何魔术。

          【讨论】:

            【解决方案10】:

            SupportNavigateUp()方法上使用并在该方法中调用onBackPressed

            【讨论】:

              【解决方案11】:

              onCreate

              {
                  ...
                          Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
                          setSupportActionBar(toolbar);
                          resetActionBar();
                  ...
               }
              
              
              public void resetActionBar()
                  {
                  getSupportActionBar().setDisplayShowHomeEnabled(true);
                  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                      getSupportActionBar().setHomeButtonEnabled(true);
                  }
              
               @Override
                        public void onBackPressed() {
                          FragmentManager fm = getSupportFragmentManager();
                          int count = fm.getBackStackEntryCount();
                          if(count == 0) {
                              // Do you want to close app?
                              showDialog();
                          }else{
                              super.onBackPressed();
                          }
                      }
              
              
                  @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();
                          Log.i("coming", "comming");
                          //noinspection SimplifiableIfStatement
                          if(id==android.R.id.home){
                              if (getSupportFragmentManager().getBackStackEntryCount() > 0)
                                  onBackPressed();
                              else
                                  drawerLayout.openDrawer(navigationView);
                              return  true;
                          }
              
                          return super.onOptionsItemSelected(item);
                      }
              

              【讨论】:

                【解决方案12】:

                如果此处的其他答案(或hereherehere)不起作用,还需要检查一件事。

                我从另一个禁用菜单的活动中复制了一些代码。删除此方法(并应用其他答案中给出的解决方案)允许向上按钮工作。

                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    // hide the menu
                    return false;
                }
                

                【讨论】:

                  【解决方案13】:

                  在我的例子中,我重写了 onCreateOptionsMenu 方法,但最后忘记调用 super。

                  【讨论】:

                    【解决方案14】:

                    工具栏启用 Kotlin 绑定的后退按钮

                    setSupportActionBar(binding.toolbar)
                    supportActionBar?.setDisplayHomeAsUpEnabled(true)
                    supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_times_ic)
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-03-28
                      • 1970-01-01
                      • 2021-11-12
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多