寻址来自另一个活动的对象

时间:2014-05-30 14:25:15

标签: android android-fragments

我想做一个非常简单的任务:

我有活动A和活动B.

活动A包含我想要从活动B更改的对象。

我尝试使用以下代码执行此操作:

Intent intent = new Intent(this, A.class); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();     
fragmentTransaction.replace(R.id.fragment_container, new LogFragment()); 
fragmentTransaction.commit(); 
startActivity(intent);

说明:

fragment_container是我想要由LogFragment替换的对象(这是一个片段,为win ^^说出名字)。

此代码无效,因为他告诉我他无法找到" fragment_container"。

我猜那是因为我还在活动B中,而#34; fragment_container"在活动A中找到。

我有什么方法可以解决" fragment_container"在活动B中做什么? 另一种可能性是我会将startActivity方法覆盖为类似的东西 startActivity(intent,fragment)。

这是否可行,如果可以,我需要覆盖哪些方法? (我得到了基本的java knowlegde,但遗憾的是没有使用android编程的经验。)

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

我不确定你到底想做什么。您尝试执行此类FragmentTransaction似乎很奇怪。如果你解释一下你想要达到的目标,我可以给你一个更准确的答案。

无论如何,您可以通过将数据添加到Activities来在Intent之间传递数据。例如,我在Fragment A中将您要显示的Activity类添加到Intent。密钥"fragmentClass"用于从Intent A中的Activity获取数据。

Intent intent = new Intent(this, A.class); 
intent.putExtra("fragmentClass", LogFragment.class);
startActivity(intent);

Activity作为onCreate()

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

    // savedInstanceState is null on the first Start of the Activity, as in when it was started with an Intent
    if(savedInstanceState == null) {

        // We get the Intent that started the Activity
        Intent intent = getIntent();

        // And retrieve the Class object we attached to the Intent with the key "fragmentClass".
        Class<?> fragmentClass = (Class<?>) intent.getSerializableExtra("fragmentClass");

        // Now we can instantiate the Fragment and perform the FragmentTransaction
        Fragment fragment = Fragment.instantiate(this, fragmentClass.getName());

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
    }
}

因此,通过使用此代码,您可以使用您喜欢的任何Activity启动Fragment A,您只需要将要显示的Fragment的类添加到{ {1}}如上所示。

答案 1 :(得分:0)

我不会将碎片用于此任务(除非您有充分的理由这样做)。

如何更改活动A中活动A中的对象,可以使用startActivityforResult方法从活动A启动活动B:

  //this is in activity A
  protected void startActivityB() {
       Intent i = new Intent(this, ActivityB.class);
       startActivityForResult(i, ACTIVITY_B);//ACTIVITY_B is a constant to identify B
  }

在活动B中,当你完成了你的东西并且想要回到活动A传递对象时:

  //this is in Activity B
  protected void goBackToActivityA() {
          Object myObjectToBePassedBack = ...;//whatever you have done/ or do to it
          Intent returnIntent = new Intent();
          returnIntent.putExtra("obj", myObjectToBePassedBack);
          setResult(RESULT_OK, returnIntent);
          finish();
  }

然后在活动A:

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == ACTIVITY_B) {
        if (resultCode == RESULT_OK) {
            Object receivedBack = data.getExtra("obj");
            //Do what you want here with the object passed back
        }
     }
  }

请注意,该对象必须是可序列化的才能执行此操作。

答案 2 :(得分:0)

如果您希望所有活动都能访问共享状态,请扩展应用程序(请参阅Extending Application to share variables globally

答案 3 :(得分:0)

等等,那么你需要在两个片段或两个活动之间发送对象吗?它的完成方式不同。

如果您尝试从活动发送到活动,则需要使用Intent的Extras部分。要在Extras中放置一些内容,它必须实现Parcelable接口。

只需将您的POJO类放入此站点,它就会拥有Parcelling的所有内容。 http://www.parcelabler.com/

但是,如果你想将它从一个片段发送到另一个片段,那么你应该使用fragment.setBundle(bundle);功能,并将Parcellable放入其中。

我不完全确定你要对碎片和活动做些什么。我想你想在这种情况下使用1个活动和2个片段,而不是2个活动......我认为它们之间共享一个片段?我真的不确定。