2

我有两个活动:主活动其他活动。在MainActivity片段启动OtherActivity,但是当我按后退按钮,在顶部,它返回我的MainActivity取而代之的是推出了OtherActivity的片段。从另一个活动返回后返回到MainActivity的片段?

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

这是我的清单。我已经设置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,当用户点击一个按钮,它加载列表片段:

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

      } 
     } 
    }); 
} 

通知它调用,这是在MainActivity定义,将推出OtherActivity当点击列表中的片段的项目。

这是OtherActivity

public class OtherActivity extends AppCompatActivity { 

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

} 

现在,当我点击在OtherActivity后退箭头按钮,该应用程序将只显示MainActivity,而不是名单片段用户上次看到。

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

编辑:似乎有关于'后退'按钮的混淆。也许他们是一样的,但我在谈论切换活动时的那个。它不是用于退出应用程序的后退按钮。 See image

+0

尝试在调用片段时删除addToBackStack(null),并参见 –

+0

从清单文件中删除android:parentActivityName =“com.example.test.MainActivity”并尝试。无论您何时单击后退按钮,它都会基本启动MainActivity新鲜activity.Please让我知道如果我是错的。 –

+0

只有一个“后退”按钮,通常用于导航后退堆栈。我认为你的更新是说你指的是“向上”按钮。 https://developer.android.com/training/appbar/up-action。html – Kuffs

回答

0

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

0

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

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

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

setHasOptionsMenu(true); 

的onCreateView方法,然后覆盖下面的方法:

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

您可以使用活动的结果,这个开始其他活动,并为一旦你想完成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(); 
     } 
    } 
} 
0

当你开始一个新的活动,现有一个堆叠,所以你可以找回以后这样的,当你按返回键。

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

在你的情况下,我怀疑你的MainActivity代码是不加区分地重新初始化你的片段,而不是检查片段是否已经存在了这个特定的活动,然后才有条件地初始化它们。

很难肯定地说,因为您的问题中没有包含任何代码。检查在MainActivity中显示片段的代码。在显示它们之前,你是否检查是否有可见的碎片?如果不是,你应该是。

例如,下面的Activity中的代码首先检查一个片段是否已经显示,然后再添加一个片段。实质上,第一次运行时,将不会有碎片,因此existing将为空,并且将创建并显示新的碎片。

当你开始一个新的OtherActivity等,然后用Back键返回到这个活动后,existing将不再为空,因为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(); 
    } 

} 

希望这个很清楚。

+1

该片段已经加载了数据,所以我有'fragmentTransaction.addToBackStack(null);'。当主活动从其他活动返回后重新启动时,我能不能从后台堆栈恢复此操作吗? – doejoe

+0

'R.id.content'实际上是主要活动的内容。这应该是片段,所以'.findFragmentByTag(“my_fragment”)',因为我点击按钮后在交易中为它创建了一个标签?但是如果它存在,我如何使用它的现有数据加载它?如果没有任何东西存在,您的示例将重新创建片段。 – doejoe

+0

我的建议(和代码示例)相当笼统,因为您没有包含任何片段创建代码。这可能是相关的,也可能不是,但这是我见过的人常犯的一个错误,你对问题的描述听起来像是一个可能的原因。 – Kuffs