从另一个Activity返回后返回MainActivity的片段?

时间:2017-07-18 05:41:36

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

我有两项活动: MainActivity OtherActivity MainActivity 中的片段启动 OtherActivity ,但是当我按下顶部的后退按钮时,它会返回 MainActivity 而不是片段启动了 OtherActivity

最终结果是将最终用户发送回主屏幕而不是他们正在使用的片段。

这是我的清单。我已将 MainActivity 设置为 OtherActivity 的父级:

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".OtherActivity"
        android:parentActivityName="com.example.test.MainActivity" >
    </activity>

MainActivity 中,当用户点击某个按钮时,它会加载一个List片段:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ...

    button.findViewById(R.id.events).setOnClickListener(new View.OnClickListener() {

         Fragment ef = new MyItemsFragment();
         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
         fragmentTransaction.addToBackStack(null);
         fragmentTransaction.replace(R.id.content, ef, "my_fragment");
         fragmentTransaction.commit();
     });

}

public void callOtherActivity() {
    Intent i = new Intent(this, OtherActivity.class);
    this.startActivity(i);
}

在List Fragment中单击某个项目时,它会启动OtherActivity。很多代码都是由android studio自动生成的。我改变了一些。在 MyItemsRecyclerViewAdapter

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.mItem = mValues.get(position);

    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != mListener) {
                // Notify the active callbacks interface (the activity, if the
                // fragment is attached to one) that an item has been selected.
                mListener.onEventFragmentInteraction(holder.mItem);

                MainActivity ma = (MainActivity) holder.mView.getContext();
                ma.callOtherActivity();

            }
        }
    });
}

注意它调用ma.callOtherActivity(),它在MainActivity中定义,并在列表片段中单击一个项目时启动OtherActivity。

这是 OtherActivity

public class OtherActivity extends AppCompatActivity {

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

}

现在,当我点击 OtherActivity 中的后退箭头按钮时,应用只会显示 MainActivity ,而不会显示用户上次看到的List片段。

如何确保从OtherActivity返回时,用户将再次看到列表片段以获得更好的用户体验?

编辑:似乎对“后退”按钮感到困惑。也许他们是一样的,但我在谈论切换活动时的那个。它不是用于退出应用程序的后退按钮。 See image

5 个答案:

答案 0 :(得分:0)

只需删除此行fragmentTransaction.addToBackStack(null);

即可

答案 1 :(得分:0)

你可以使用getSupportFragmentManager()。getBackStackEntryCount(); MainActivity的onBackPressed方法中的方法。 OnClick bottom系统后退按钮。 按照以下方法。

@Override
public void onBackPressed() {    
int backstack = getSupportFragmentManager().getBackStackEntryCount();
 if (backstack > 0) {
        getSupportFragmentManager().popBackStack();
    } else {
            super.onBackPressed();
            System.exit(0);
      }}

在片段中,按下顶部的后退按钮。 试试这个, 在onCreate方法或Fragment的onCreateView方法中调用此默认方法

setHasOptionsMenu(true);

然后覆盖以下方法:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
             getFragmentManager().popBackStack();
             break;
         }
       return super.onOptionsItemSelected(item);
}

答案 2 :(得分:0)

您可以将Activity用于此开始其他活动的结果,只要您想完成OtherActivity,只需执行setResult,MainActivity将收到此结果并执行以下操作

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    }

代码在MainActivity

中会是这样的
public void callOtherActivity() {
    Intent i = new Intent(this, OtherActivity.class);
   startActivityForResult(i, 1);
}

并在OtherActivity的onBackPress下面调用方法。

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

现在在MainActivity onActivityresult

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
        }
    }
 }

答案 3 :(得分:0)

当您开始新活动时,现有活动会堆叠在一起,以便您稍后可以检索它,例如当您按返回键时。

按Back键,重新启动Activity。这是重要的部分。它不仅与上次使用时完全一样。这意味着您作为开发人员必须注意将Activity恢复到您希望它处于的状态。任何片段都已处于正确状态,但您必须注意不要在Activity重新启动时覆盖该状态。

在您的情况下,我怀疑您的MainActivity代码不加选择地重新初始化您的片段,而不是检查该特定活动是否已存在片段,然后才有条件地初始化它们。

由于您未在问题中包含任何代码,因此很难确定。检查显示MainActivity中片段的代码。在显示它们之前,您是否正在检查是否已显示碎片?如果没有,你应该是。

例如,下面的Activity中的代码首先检查片段是否已在添加新片段之前显示。基本上,第一次运行时,将没有片段,因此existing将为null,并且将创建并显示新的片段。

启动新的OtherActivity等,然后使用Back键返回此活动后,existing将不再为null,因为Fragment系统会将任何现有的片段还原回容器。因此,我们实际上什么都不做。

@Override
protected void onCreate(Bundle b) {
    super.onCreate(b);

    Fragment existing = getSupportFragmentManager().findFragmentById(R.id.content);

    if (existing == null) {
        Fragment newFragment = new MyFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, newFragment)
                .commit();
    }

}

希望这很清楚。

答案 4 :(得分:0)

我可能迟到了,但由于MainActivity的OnStart方法中的LoadFragment方法,出现了错误