我想做一个非常简单的任务:
我有活动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编程的经验。)
感谢您的帮助。
答案 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个活动......我认为它们之间共享一个片段?我真的不确定。