Android 在两个不同活动中的两个片段之间传递数据
我试图用片段做一个非常基本的例子 结构:Fragment1->Fragment1活动,Fragment2->Fragment2活动。 这两个活动都有一个静态片段 以下是XML: _片段_1.xml的活动_Android 在两个不同活动中的两个片段之间传递数据,android,android-fragments,Android,Android Fragments,我试图用片段做一个非常基本的例子 结构:Fragment1->Fragment1活动,Fragment2->Fragment2活动。 这两个活动都有一个静态片段 以下是XML: _片段_1.xml的活动_ <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fra
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.xx.fragmentstutorial1.Fragment1"
tools:context="com.xx.fragmentstutorial1.Fragment1Activity"/>
Fragment1.java
public class Fragment1 extends SherlockFragment {
EditText message;
Button clickme;
ButtonClickListener listener;
public interface ButtonClickListener{
public void onButtonClick(String message);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof ButtonClickListener)
listener = (ButtonClickListener) activity;
else {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
System.out.println("onCreateView Fragment1");
View view = inflater.inflate(R.layout.fragment_1, container, false);
message = (EditText) view.findViewById(R.id.edittext_fragment_1_text);
clickme = (Button) view.findViewById(R.id.button_fragment_1);
clickme.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!message.getText().toString().equalsIgnoreCase("")) {
System.out.println("Message in Fragment1 = "+message.getText().toString());
listener.onButtonClick(message.getText().toString());
} else {
Toast.makeText(getActivity(),
"Please enter some message...", Toast.LENGTH_LONG)
.show();
}
}
});
return view;
}
}
Fragment2Activity.java
public class Fragment1Activity extends SherlockFragmentActivity implements Fragment1.ButtonClickListener{
Fragment1 fragment1;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_for_fragment_1);
System.out.println("onCreate Fragment1Activity");
fragment1 = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.fragment_1);
}
@Override
public void onButtonClick(String message) {
System.out.println("onButtonClick Fragment1Activity");
startActivity(new Intent(this, Fragment2Activity.class).putExtra("message", message));
}
}
public class Fragment2Activity extends SherlockFragmentActivity {
Fragment2 fragment2;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_for_fragment_2);
fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment_2);
fragment2.setMessage(getIntent().getExtras().getString("message").toString());
}
}
Fragment2.java
public class Fragment2 extends SherlockFragment {
String msg;
TextView textview;
public Fragment2() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_2, container, false);
textview = (TextView) view
.findViewById(R.id.textview_fragment_2_result);
textview.setText(msg);
return view;
}
public void setMessage(String message) {
msg = message;
textview.setText(msg);
}
}
我已经在Fragment2.java的setMessage()中为textview设置了文本,我认为这不是一个好方法。如果我把它注释掉,我在Fragment2的文本视图中看不到任何文本
有人能帮我解决一下,如何在两个静态片段之间正确地传递值 您应该使用
界面
请按照此处的示意图进行操作:
两个片段之间的通信是通过使用接口的活动完成的
Fragment
A----------------------------------->Activity
----------------------->Fragment
B
(定义接口
)(实现接口
)(传递其他片段B)
希望这能有所帮助
你所拥有的大部分都是好的。将数据从Fragment1传输到Activity1的部分很好。一旦数据到达Activity2,您就可以在Fragment2中设置它。我会稍微改变一下这部分 在活动2中:
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_for_fragment_2);
fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment_2);
fragment2.setArguments(getIntent().getExtras());
}
零碎的2
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle bundle = getArguments();
String message = bundle.getString("message");
View view = inflater.inflate(R.layout.fragment_2, container, false);
textview = (TextView) view
.findViewById(R.id.textview_fragment_2_result);
textview.setText(message);
return view;
}
你的方法似乎是正确的。Fragment1和Activity1之间的连接就像在片段中一样。您的fragment1不应该知道fragment2,因此可以将责任传递给片段的容器/父级activity1,后者知道如何处理数据。这一次,您的方法是正确的-activity1启动它的从属/子等,并负责使用正确的数据启动它(通过intent extras传递)。然后你又有了一个正确的方法-当你的活动2被创建时,你用适当的内容/数据(消息)填充它的视图,这些内容/数据本应显示在此活动中,并由“父”活动提供给它。这不是我想要的。。FragmentA->Activity A->Activity B->Fragment B,这是我正在寻找的。您所做的是人们使用的一种方法,或者将值存储在共享首选项中,并在启动活动后从第二个片段中获取,就像您所做的一样
public class Fragment2 extends SherlockFragment {
String msg;
TextView textview;
public Fragment2() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_2, container, false);
textview = (TextView) view
.findViewById(R.id.textview_fragment_2_result);
textview.setText(msg);
return view;
}
public void setMessage(String message) {
msg = message;
textview.setText(msg);
}
}
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_for_fragment_2);
fragment2 = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment_2);
fragment2.setArguments(getIntent().getExtras());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle bundle = getArguments();
String message = bundle.getString("message");
View view = inflater.inflate(R.layout.fragment_2, container, false);
textview = (TextView) view
.findViewById(R.id.textview_fragment_2_result);
textview.setText(message);
return view;
}