Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建一个界面来获取Android活动片段的信息?_Java_Android_Xml_Android Fragments_Android Edittext - Fatal编程技术网

Java 如何创建一个界面来获取Android活动片段的信息?

Java 如何创建一个界面来获取Android活动片段的信息?,java,android,xml,android-fragments,android-edittext,Java,Android,Xml,Android Fragments,Android Edittext,在过去的几天里,我一直在拼命尝试用一个简单的片段(我用了两次)构建一个android应用程序。我想将片段的编辑文本框的内容传递给一个新的活动。我只是不知道如何从碎片中获取这些内容。到目前为止,我得到的是: 我有了我的edit\u text\u fragment.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an

在过去的几天里,我一直在拼命尝试用一个简单的片段(我用了两次)构建一个android应用程序。我想将片段的编辑文本框的内容传递给一个新的活动。我只是不知道如何从碎片中获取这些内容。到目前为止,我得到的是:

我有了我的
edit\u text\u fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <EditText 
        android:id="@+id/my_edit_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="my hint" />
</LinearLayout>
然后,我在我的
main.xml
中使用此片段两次,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <fragment 
        android:id="@+id/detailfragment_placeholder"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        class="com.example.fragmenttester5.MyEditTextFragment" />
    <fragment 
        android:id="@+id/detailfragment_placeholder2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        class="com.example.fragmenttester5.MyEditTextFragment" />
    <Button 
        android:id="@+id/submit_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Submit all of it" />
</LinearLayout>
我想我现在需要在片段中定义某种接口,但我找不到如何定义。我读了一些例子和教程(比如),但它们对我来说毫无意义。我不理解给出的代码,我只是不知道如何根据我的用例调整它


所以我的问题,;有人能帮我从活动中获取片段的内容吗?示例将非常受欢迎,因为我在这里只是把头撞在墙上。

在较高的层次上,有两个任务通常需要使用片段来解决。第一个是将数据从活动传递到片段。第二个是将数据从片段传递到活动

活动知道它包含哪些片段,因为它创建了这些片段,所以很容易通过这种方式进行通信——只需对片段本身调用方法即可。但事实并非如此;片段可能附加到任意数量的随机活动,因此它对其父活动一无所知

解决方案是实现一个接口,该接口由活动实现,片段知道如何与之通信。这样,你的片段就有了它知道如何与之对话的东西。这里有一些具体的代码示例说明如何执行此操作:


(特别是,请查看“创建活动的事件回调”代码示例)。

因此,如果事件发生在
片段中,您可以创建一个与
活动
对话的界面。对于这种情况,您只需在
片段
中创建一个
活动
可以调用的可访问方法。所以

public class MyEditTextFragment extends Fragment {
    private EditText mEditText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.edit_text_fragment, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mEditText = (EditText) getView().findViewById(R.id.my_edit_text);
    }

    public Editable getText() {
        return mEditText.getText();
    }
}
然后


这假设您在
FragmentTransaction
中分配了
Fragment
标记。确保检查空
片段
(为简洁起见省略)

没错,这是一种将数据从片段传递到活动的标准方法

基本上,您定义了活动实现的
侦听器
接口,活动将自己注册为片段的侦听器

下面是一个简单的例子:

片段

class MyFragment extends Fragment {

    interface Listener {
        public void somethingHappenedInFragment(Object... anyDataYouWantToPassToActivity);
    }

    private Listener mListener;

    public void setListener(Listener listener) {
        mListener = listener;
    }

    // ... your code ...

    // Now here you pass the data to the activity
    mListener.somethingHappenedInFragment(some, data);

    // ... more of your code
 }
活动

public MyActivity extends Activity implements MyFragment.Listener {

    // ... your code ...

    // creating the Fragment
    MyFragment f = new MyFragment();

    // register activity as listener
    f.setListener(this);

    // ... more of your code

    // implementation of MyFragment.Listener interface
    @Override
    public void somethingHappenedInFragment(Object... anyDataYouWantToPassToActivity) {
        // here you have the data passed from the fragment.
        for (Object o : anyDataYouWantToPassToActivity {
            System.out.println(o.toString();
        }
    }

}

活动将从片段中的updateDetail()方法接收数据

//// Activity 
public class RssfeedActivity extends Activity implements MyListFragment.OnItemSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rssfeed);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d("Annv - Fragment", "onClick here");
            }
        });
    }

    // if the wizard generated an onCreateOptionsMenu you can delete
    // it, not needed for this tutorial

    @Override
    public void onRssItemSelected(String link) {
        //        DetailFragment fragment = (DetailFragment) getFragmentManager()
        //                .findFragmentById(R.id.detailFragment);
        //        if (fragment != null && fragment.isInLayout()) {
        //          fragment.setText(link);
        //        } 
        //        Intent start = new Intent(this, RssfeedSecondActivity.class);
        //        startActivity(start);
        DetailFragment fragment = (DetailFragment) getFragmentManager()
                .findFragmentById(R.id.detailFragment);
        if (fragment != null && fragment.isInLayout()) {
            fragment.setText(link);
        }
    }

}

好吧,我大概有那么远。我现在需要在片段中创建一个接口,并在活动中实现它。我只是不明白怎么做。如果你能帮我写一些代码片段让我开始学习,那就太好了。实际上,这里根本不需要接口。操作发生在
活动中,而不是
片段中(按钮不在片段中)。看到我的答案了。事实上,你的片段被XML膨胀了,所以你根本不需要调用
getFragmentManager().findFragmentByTag
。现在更新答案。你太棒了!你基本上让我整个周末都很棒!谢谢你你能回答吗?代码转储不是答案。请编辑您的答案,解释您的代码是什么以及它如何回答问题。请在片段中重写
onAttach()
,否则您可能会在
mListener
上获得NPE。
class MyFragment extends Fragment {

    interface Listener {
        public void somethingHappenedInFragment(Object... anyDataYouWantToPassToActivity);
    }

    private Listener mListener;

    public void setListener(Listener listener) {
        mListener = listener;
    }

    // ... your code ...

    // Now here you pass the data to the activity
    mListener.somethingHappenedInFragment(some, data);

    // ... more of your code
 }
public MyActivity extends Activity implements MyFragment.Listener {

    // ... your code ...

    // creating the Fragment
    MyFragment f = new MyFragment();

    // register activity as listener
    f.setListener(this);

    // ... more of your code

    // implementation of MyFragment.Listener interface
    @Override
    public void somethingHappenedInFragment(Object... anyDataYouWantToPassToActivity) {
        // here you have the data passed from the fragment.
        for (Object o : anyDataYouWantToPassToActivity {
            System.out.println(o.toString();
        }
    }

}
//// Activity 
public class RssfeedActivity extends Activity implements MyListFragment.OnItemSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rssfeed);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d("Annv - Fragment", "onClick here");
            }
        });
    }

    // if the wizard generated an onCreateOptionsMenu you can delete
    // it, not needed for this tutorial

    @Override
    public void onRssItemSelected(String link) {
        //        DetailFragment fragment = (DetailFragment) getFragmentManager()
        //                .findFragmentById(R.id.detailFragment);
        //        if (fragment != null && fragment.isInLayout()) {
        //          fragment.setText(link);
        //        } 
        //        Intent start = new Intent(this, RssfeedSecondActivity.class);
        //        startActivity(start);
        DetailFragment fragment = (DetailFragment) getFragmentManager()
                .findFragmentById(R.id.detailFragment);
        if (fragment != null && fragment.isInLayout()) {
            fragment.setText(link);
        }
    }

}
/// Fragment
public class MyListFragment extends Fragment {

    private OnItemSelectedListener listener;
    private OnItemStartActivityListener listenerStartAct;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_rsslist_overview,
                container, false);
        Button button = (Button) view.findViewById(R.id.button1);
        Log.d("Annv - Fragment", "run on " + getActivity().toString());
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateDetail();
            }
        });
        return view;
    }

    public interface OnItemSelectedListener {
        public void onRssItemSelected(String link);
    }

    public interface OnItemStartActivityListener {
        public void onRssStartActivity(String link);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (activity instanceof OnItemSelectedListener) {
            Log.d("Annv - Fragment", "activity " + activity.getLocalClassName());
            listener = (OnItemSelectedListener) activity;
        } else if (activity instanceof OnItemStartActivityListener) {
            Log.d("Annv - Fragment", "activity " + activity.getLocalClassName());
            listenerStartAct = (OnItemStartActivityListener) activity;
        } else {
            throw new ClassCastException(activity.toString()
                    + " must implemenet MyListFragment.OnItemSelectedListener");
        }
    }

    // May also be triggered from the Activity
    public void updateDetail() {
        // create fake data
        //        String newTime = String.valueOf(System.currentTimeMillis());
        //        // Send data to Activity
        //        listenerStartAct.onRssItemSelected(newTime);
        if (getActivity() instanceof OnItemSelectedListener) {
            listener.onRssItemSelected("start start");
        } else {
            String newTime = String.valueOf(System.currentTimeMillis());
            listenerStartAct.onRssStartActivity(newTime);
        }

    }

}