【问题标题】:Navigate via back-button from child fragment back to parent activity通过后退按钮从子片段导航回父活动
【发布时间】:2015-05-15 14:08:21
【问题描述】:

我有一个主要活动和 2 个片段。在我的主要活动中,我有导航抽屉,可以浏览片段。我像这样处理按下的后退按钮:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStackImmediate();
    } else {
        super.onBackPressed();
    }
}

在两个片段之间导航后,当我点击后退按钮时,我从后台堆栈中获取最后一个片段。但是,从片段导航到另一个片段应该是不可能的。

更清晰:

我有一个活动(带有导航抽屉)和 2 个片段。从导航抽屉中,我可以根据需要多次访问这两个片段。但是当我点击返回按钮时,我总是想回到main_activity.xml

【问题讨论】:

  • 我想做的是随时从任何片段返回我的 man 活动。,如果你没有开始一个新的活动,你总是在你的 @987654323 @
  • @Blackbelt 对不起,我的意思是回到main_activity.xml。编辑了问题
  • 所以...您只有一项活动。你想回到这个你仍在进行的活动。对我来说没有意义 :( 你还在 main_activity.xml 中。如果你想得到同样的结果,让我们说“状态”就像一开始一样,从片段中调用你的活动来做到这一点。
  • @JacksOnF1re 查看更新后的问题。我希望那更清楚

标签: android android-layout android-fragments android-activity fragment-backstack


【解决方案1】:

当您浏览活动时,最好的方法是像这样使用Intents(如果我理解您的问题):

Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

【讨论】:

  • 我有 1 个活动(带有导航抽屉)和 2 个片段。从导航抽屉中,我可以根据需要多次访问这两个片段。但是当我点击后退按钮时,我想回到 main_activity.xml 而不是从堆栈中弹出
  • 尝试再创建一个片段,即主页片段,并将您在 main_activity.xml 中的所有内容放在那里,您可以从导航抽屉返回到它。我认为当你在一个活动中有片段时,你不能在它们之外有布局
  • 酷,感谢您的回复。帮助我想出了一个解决方案。 +1 并接受
  • @Alias 你能发布你的解决方案吗?
【解决方案2】:
**OnCreate() :-**


public boolean onKeyDown(int keyCode, KeyEvent event)
 {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent returnIntent = new Intent();
            setResult(RESULT_CANCELED, returnIntent);
            this.finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

ActionBar mActionBar = getActionBar();
        mActionBar.setDisplayShowHomeEnabled(false);
        mActionBar.setDisplayShowTitleEnabled(false);

LayoutInflater mInflater = LayoutInflater.from(this);

View mCustomView = mInflater.inflate(R.layout.actionbar_category_feed_list, null);

        RelativeLayout rrBack = (RelativeLayout) mCustomView.findViewById(R.id.rr_back);
        TextView title = (TextView) mCustomView.findViewById(R.id.txt_title);
        title.setText("");
        title.setTypeface(typeFaceMedium);
        rrBack.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                mTracker.send(new HitBuilders.EventBuilder().setCategory("" + userUsername).setAction("On Search Feed Screen").setLabel("Pressed Back Button").build());
                Intent returnIntent = new Intent();
                setResult(RESULT_CANCELED, returnIntent);
                finish();
            }
        });
        mActionBar.setCustomView(mCustomView);
        mActionBar.setDisplayShowCustomEnabled(true);

**actionbar_category_feed_list.xml**

?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:background="@android:color/white" >

    <RelativeLayout
        android:id="@+id/rr_back"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" >

        <ImageView
            android:id="@+id/img_logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:focusable="false"
            android:src="@drawable/back_red" />
    </RelativeLayout>

    <com.converza.library.CustomTextView
        android:id="@+id/txt_title"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/rr_back"
        android:gravity="center_vertical"
        android:paddingLeft="8dp"
        android:text="@string/app_name" />

</RelativeLayout>



**At last in your fragment Activity use a OnactivityResult() for get a Returnintent from Activity.**

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Const.FEEDDETAIL && resultCode == Activity.RESULT_OK) {
            Log.e(tag, "DatashBoard Const.FEEDDETAIL RESULT_OK");
        } else if (requestCode == Const.FEEDDETAIL && resultCode == Activity.RESULT_CANCELED) {
            Log.e(tag, "DatashBoard Const.FEEDDETAIL RESULT_CANCELED");
        }
    }

【讨论】:

    【解决方案3】:

    您必须通过标签找到片段并检查它是否为空,如果为空则替换该片段或如果片段被隐藏则再次显示该片段。

        @Override
        public void onBackPressed() {
                 Fragment fr = getSupportFragmentManager()
                    .findFragmentByTag("Fragment_Tag");
    
            if (fr == null) {
                getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.container,
                            new Main_Fragment(), "Fragment_Tag").commit();
            } else {
                finish();
            }
    }
    

    【讨论】:

    • 你的成品来自哪里
    • 你可以把 super.onBackPressed();而不是完成();。并完成();是 Activity 的一部分。
    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多