操作栏后退按钮不起作用


74

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

在此处输入图片说明

输出:

但是我的问题是,观看图库图像后,按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;
    }

}

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


1
您是否尝试过在AndroidManifest中声明ParentActivities?
x90 2014年

@ x90检查我编辑的帖子。
2014年

您确定要将android:parentActivityName =“ com.sit.fth.activity.HomeActivity”定义为com.sit.fth.activity.HomeActivity吗?例如,您应将HomeActivity定义为GalleryActivity的父活动。不对自己。
x90 2014年

@ x90 HomeActivity是一个mainActivity(父母活动)
史蒂夫

Answers:


179

我通过在中添加以下代码解决了这些问题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());
    } 

1
发现!onBackPressed正是我想要的。我的设置屏幕之一正在从多个屏幕中打开,我想回到打开它的相同活动。android.R.id.home在android活动的上下文中,这个特殊的id是什么?
RBT


使用onBackPressed不建议您OptionsMenu家行动:向上键(后退箭头在左上角)用于基于屏幕之间的层次关系的应用程序中浏览时,系统返回按钮用于导航,按时间倒序,通过用户最近使用过的屏幕的历史记录。您可以在此处了解更多信息:developer.android.com/design/patterns/navigation.html
Mike,

40

请阅读

您应该具有以下内容:

    <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)。


@斯蒂芬闲置在哪里?而且我仍然不了解您要从哪个活动导航到哪个活动。
x90 2014年

Gallery Detail FragmentGallery Activity.I在图像显示还
史蒂夫

@StephenGalleryDetailFragment主持哪个活动?
x90 2014年

@斯蒂芬我明白。但每个片段都应托管/附加/连接/属于Activity。我在问哪个活动属于您的片段。
x90 2014年


36

您需要在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”添加到清单中,并且使用此设备对其进行测试就足够了。
大卫,

尽管此方法可行,但请先android:parentActivityName手动检查是否已设置好活动设置,然后再手动调用onBackPressed。参见stackoverflow.com/a/24033351/1563833
Wyck

13

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

    android:parentActivityName=".activities.MainActivity"

10

尝试像

首先,你需要使用addToBackStack()之前commit()的片段

@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);
     } 

3
这是什么,你能解释一下吗?
Wang'l Pakhrin 2015年

4

最好和简单的答案是在清单文件中添加父活动名称,以便操作栏后退按钮可以使用。

对于清单文件的活动标签下的使用 android:parentActivityName=".MyCustomParentActivity"


1

这里提供的答案均不适合我。我不得不把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;
    }
}


1

如果显示主页按钮。您应该通过onOptionItemSelected fun(在您的情况下为箭头)将操作添加到主页按钮,默认情况下没有任何操作。因此无法正常运作是完全正常的。请将此乐趣添加到您的活动中:

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

0

对我来说,我必须设置mDrawerToggle.setToolbarNavigationClickListener(...)一个触发后退动作的侦听器。否则它什么都不做。这是其源代码ActionBarDrawerToggle如下所示:

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

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


0

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);
        }

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.