在一个活动中dynamic地实现多个片段

我正在处理碎片


用例我试图实现 ::

  • 我正在使用dynamic片段
  • 我正在一个活动中使用三个片段
  • 我的目标是在三个片段之间进行沟通
  • 我正在使用支持包的碎片

每个片段都有一个小部件

  • my_fragment1edittext
  • my_fragment2button
  • my_fragment3TextView

点击buttonedittext的文本必须显示在文本edittext


到目前为止,我已经尝试过构build下面的大部分场景


Top_Fragment.java

 public class Top_Fragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view=inflater.inflate(R.layout.my_fragment1, container, false); return view; } } 

Middle_Fragment.java

 package com.example.deleteme; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class Middle_Fragment extends Fragment{ View view; Button btn; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment2, container, false); btn=(Button) view.findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); return view; } } 

Bottom_Fragment.java

 public class Bottom_Fragment extends Fragment{ View view; TextView display_text; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment3, container,false); display_text=(TextView) view.findViewById(R.id.editText1); return view; } public void setName(String Name){ display_text.setText("Result::" + Name); } } 

MainActivity.java

 public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Top_Fragment frg=new Top_Fragment();//create the fragment instance for the top fragment Middle_Fragment frg1=new Middle_Fragment();//create the fragment instance for the middle fragment Bottom_Fragment frg2=new Bottom_Fragment();//create the fragment instance for the bottom fragment FragmentManager manager=getSupportFragmentManager();//create an instance of fragment manager FragmentTransaction transaction=manager.beginTransaction();//create an instance of Fragment-transaction transaction.add(R.id.My_Container_1_ID, frg, "Frag_Top_tag"); transaction.add(R.id.My_Container_2_ID, frg1, "Frag_Middle_tag"); transaction.add(R.id.My_Container_3_ID, frg2, "Frag_Bottom_tag"); transaction.commit(); } } 

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".MainActivity" android:background="@color/black"> <FrameLayout android:id="@+id/My_Container_1_ID" android:layout_width="fill_parent" android:layout_height="150dp" android:background="@color/yellow"> </FrameLayout> <FrameLayout android:id="@+id/My_Container_2_ID" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_alignParentLeft="true" android:layout_below="@+id/My_Container_1_ID" android:background="@color/Orange" > </FrameLayout> <FrameLayout android:id="@+id/My_Container_3_ID" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_alignParentLeft="true" android:layout_below="@+id/My_Container_2_ID" android:background="@color/purple" > </FrameLayout> </RelativeLayout> 

my_fragment1.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/green" > <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:ems="10" android:textColor="#000000" android:singleLine="true" > <requestFocus /> </EditText> </RelativeLayout> 

my_fragment2.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/pink"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:background="@color/black" android:text="Button" android:textColor="#FFFFFF" /> </RelativeLayout> 

my_fragment3.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="TextView" android:textColor="#000000" android:textSize="30dp" /> </RelativeLayout> 

我的输出如下所示 ::

在这里输入图像说明


我有什么问题在实现 ::

  • 点击button我无法将从edit text获得的值设置为textview

有任何想法吗?

Related of "在一个活动中dynamic地实现多个片段"

所有片段到片段的通信都是通过关联的活动完成的。 两个碎片不应该直接沟通。

http://developer.android.com/training/basics/fragments/communicating.html

test.java //在你的情况下它的MainActivity

  public class test extends FragmentActivity implements textEntered { String value; boolean check=false; BottomFragment frg2; FragmentTransaction transaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Top_Fragment frg=new Top_Fragment(); frg2=new BottomFragment(); FragmentManager manager=getSupportFragmentManager(); transaction=manager.beginTransaction(); transaction.add(R.id.My_Container_1_ID, frg, "Frag_Top_tag"); transaction.add(R.id.My_Container_3_ID, frg2, "Frag_Bottom_tag"); transaction.commit(); } @Override public void setValue(String editextvalue) { // TODO Auto-generated method stub value =editextvalue; Log.i("..............",""+value); if (frg2 != null) { frg2.setName(value); } else { Toast.makeText(getApplicationContext(),"fragment 2 is null", 1000).show(); } } } Top_Fragment.java public class Top_Fragment extends Fragment{ textEntered mCallback; Button b; EditText ed; public interface textEntered { public void setValue(String editextvalue); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view=inflater.inflate(R.layout.my_fragment1, container, false); ed = (EditText) view.findViewById(R.id.editText1); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); b= (Button) getView().findViewById(R.id.button1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String s =ed.getText().toString(); mCallback.setValue(s); } }); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (textEntered) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement textEntered"); } } } 

my_fragment1.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:ems="10" android:textColor="#000000" android:singleLine="true" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editText1" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:text="Button" /> </RelativeLayout> 

改成

  display_text=(TextView) view.findViewById(R.id.textView1); // id is textView 1 not editText1 

在BottomFragment中

在这里输入图像说明

您可以使用该活动。

在底部片段的onClick,你可以做类似的事情

((MainActivity) getActivity()).doIt();

在你的MainActivity做一个方法doIt可能是这样的

 public void doIt(){ frg2.setName(frg.getText()) } 

并在顶部的片段中创build一个getText方法,该方法返回EditText的文本

碎片之间的通信

可能有很多场景需要片段之间的通信。 您需要在button单击事件的片段之间传递数据。 您也可以使用Android工具栏在片段之间切换。 当您将button添加到工具栏时,您需要使用片段dynamic更改屏幕。

创build一个接口 ,这将有助于我们沟通

Communicate.java

 package com.example.amaanmemon.testfragment; interface Communicate { public void sendData(); } 

TopFragment.java

 package com.example.amaanmemon.testfragment; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; public class TopFragment extends Fragment { EditText firstName; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view=inflater.inflate(R.layout.my_fragment1, container, false); return view; } public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); firstName = (EditText) getActivity().findViewById(R.id.editText1); } public String getData(){ return firstName.getText().toString(); } } 

MiddleFragment.java

 package com.example.amaanmemon.testfragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class MiddleFragment extends Fragment implements OnClickListener{ View view; Button btn; Communicate cm; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment2, container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); cm = (Communicate) getActivity(); btn = (Button) getActivity().findViewById(R.id.button1); btn.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub cm.sendData(); } } 

BottomFragment.java

 package com.example.amaanmemon.testfragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class BottomFragment extends Fragment{ int count; View view; TextView display_text; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment3, container,false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); display_text = (TextView)getActivity().findViewById(R.id.textView1); } public void incrementData(String displayText){ display_text.setText(displayText); } } 

MainActivity.java

 package com.example.amaanmemon.testfragment; import android.support.v4.app.FragmentActivity; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; public class MainActivity extends FragmentActivity implements Communicate{ TopFragment frg; MiddleFragment frg1; BottomFragment frg2; FragmentTransaction transaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frg = new TopFragment(); frg1 = new MiddleFragment(); frg2 = new BottomFragment(); FragmentManager manager=getSupportFragmentManager(); transaction=manager.beginTransaction(); transaction.add(R.id.My_Container_1_ID, frg, "Frag_Top_tag"); transaction.add(R.id.My_Container_2_ID, frg1, "Frag_Middle_tag"); transaction.add(R.id.My_Container_3_ID, frg2, "Frag_Bottom_tag"); transaction.commit(); } @Override public void sendData() { String temp = frg.getData(); frg2.incrementData(temp); } } 

您可以复制问题的XML文件。 你可以看下面的输出。

产量