如何在最上面的片段上触发onResume(),在背面按下

时间:2015-06-22 00:48:33

标签: android android-fragments android-activity android-fragmentactivity onresume

我有2个活动。在第一个活动中,最初有一个片段

MainActivity.java

public class MainActivity extends Activity {
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        if(savedInstanceState == null) {
            getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, MainFragment.newInstance().commit();
        }
    }
}

然后用另一个片段点击按钮replaces

@Override
public void onClick(View arg0) {
    DetailFragment detail = (DetailFragment)getFragmentManager().findFragmentById(R.id.detail);
    getFragmentManager().beginTransaction().replace(R.id.detail, detail, "detail").commit();
}

在第二片段上有另一个按钮,点击它会打开一个新活动。

Intent popUp = new Intent(MainActivity.this, PopUp.class);                      
popUp.putExtra("CarID", carID);
startActivity(popUp);

从PopUp Activity,按设备将返回MainActivity。 现在面临的挑战是应用程序的业务逻辑,我需要在用户返回时更新ActionBar的上一个MainActivity的标题。

为此,我在MainFragment和DetailFragment上监听onResume()。此外,当用户从DetailFragment返回MainFragment时,我使用不同的文本更新ActionBar标题。

所以我需要知道用户何时回来:

  

1)PopUp活动>细节片段

     

2)细节片段>主要片段

onResume()关闭时,MainFragmentDetailFragment同时触发了PopUpActivity。在MainFragment我无法确切地知道是否为第一或第二案件调用了onResume()

仅当用户从onResume()&gt;返回时,DetailFragment PopUpActivity上的DetailFragment触发的最佳做法是什么? DetailFragment。换句话说,如何从PopUpActivity检测到onResume()已关闭,而MainFragmentpublic static void Focus<T>(Form parent) where T : System.Windows.Forms.Form { bool isOpen = false; foreach (var f in Application.OpenForms) { if (f is T) { isOpen = true; (f as Form).Focus(); break; } } if (!isOpen) { T newForm = Activator.CreateInstance<T>(); newForm.MdiParent = parent; newForm.Show(); } } {。}}。

2 个答案:

答案 0 :(得分:3)

我不会因为这样的事情而混淆onResume()

我建议你做以下事情:

  • 为标题创建Stack<String>
  • FragmentManager.OnBackStackChangedListener
  • 中实施MainActivity
  • onBackStackChanged()实施中,使用FragmentManager.getBackStackEntryCount()检查是否已推送或弹出后筹码组。
    • 如果已经推后堆栈,请将新显示的片段标题推送到标题堆栈。
    • 如果后面的堆栈已经弹出,请弹出一个标题并设置标题栏,标题栏位于新的堆栈顶部。
  • 如果您从添加到后堆栈的片段中设置标题,则从标题堆栈中弹出标题并按下新显示的片段标题,即替换标题最重要的。
  • 使用PopupActivity代替startActivityForResult()
  • 调用startActivity()
  • 覆盖onActivityResult()中的MainActivity,以便在PopupActivity返回时,设置标题栏,标题位于堆栈顶部。
  • 不要忘记在onSaveInstanceState()的{​​{1}}中保留标题堆栈,并将其恢复为MainActivity

这似乎只是为了维护游戏而做了很多工作,但是你会因为onCreate()而试图做到这一点而疯狂。

答案 1 :(得分:0)

试一试:

@Override
public void onResume() {

super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

            // handle back button

            return true;

        }

        return false;
    }
});

}