Android 在两个不同活动中的两个片段之间传递数据

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

我试图用片段做一个非常基本的例子

结构: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/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;
}