在单个活动中动态实现多个片段
Posted
技术标签:
【中文标题】在单个活动中动态实现多个片段【英文标题】:Implementing multiple fragments in a single activity Dynamically 【发布时间】:2013-11-12 10:20:01 【问题描述】:我正在处理片段
我正在尝试实现的用例::
我正在使用动态片段 我在一个活动中使用了三个片段 我的目标是在所有三个片段之间进行通信 我正在使用片段支持包每个片段都有一个小部件
my_fragment1
有 edittext
my_fragment2
有 button
my_fragment3
有 TextView
点击button
时,edittext
中的文本必须显示在textview
中
到目前为止,我已经尝试过构建以下大部分场景
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_
android:layout_
tools:context=".MainActivity"
android:background="@color/black">
<FrameLayout
android:id="@+id/My_Container_1_ID"
android:layout_
android:layout_
android:background="@color/yellow">
</FrameLayout>
<FrameLayout
android:id="@+id/My_Container_2_ID"
android:layout_
android:layout_
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_
android:layout_
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_
android:layout_
android:background="@color/green" >
<EditText
android:id="@+id/editText1"
android:layout_
android:layout_
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_
android:layout_
android:orientation="vertical"
android:background="@color/pink">
<Button
android:id="@+id/button1"
android:layout_
android:layout_
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_
android:layout_ >
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="TextView"
android:textColor="#000000"
android:textSize="30dp" />
</RelativeLayout>
我的输出如下所示 ::
我在实现方面遇到的问题 ::
我无法将从edit text
获得的值设置为
textview
点击button
有什么想法吗?
【问题讨论】:
你在哪里打电话setName(String Name)
??
请检查文档。有一个例子。 developer.android.com/guide/components/fragments.html
developer.android.com/training/basics/fragments/…。所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。
不,你不需要那样做。等等,我会发布一个答案,你不需要片段 2,它只是一个按钮
你需要按钮是顶部片段来获取editext值。您在某些操作上获得了 editext 的值,因此您需要顶部片段中的按钮。中间片段中的第二个按钮是没用的。第三,要了解流程,您需要知道如何通过活动在片段之间进行通信,这就是这里所做的。
【参考方案1】:
所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。
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)
value = editextvalue;
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_
android:layout_ >
<EditText
android:id="@+id/editText1"
android:layout_
android:layout_
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_
android:layout_
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
在底部片段中
抓拍
【讨论】:
谢谢,我明白了大部分的东西.....但是什么是 mcallback .... 你为什么要实现 textentered ..... 可以用外行的话来说明! @smriti3 它是用作回调的 anitnerface。您在片段中定义接口并在活动中实现它。textentered
是一个接口【参考方案2】:
片段之间的通信
可能有很多场景需要片段之间的通信。您需要在按钮单击事件的片段之间传递数据。您还可以使用 Android 工具栏在片段之间切换。向工具栏添加按钮时,需要使用片段动态更改屏幕。
创建一个界面,这将有助于我们进行交流
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 文件。 你可以看下面的输出。
【讨论】:
【参考方案3】:您可以为此使用 Activity。
在底部片段的 onClick 中,您可以执行类似的操作
((MainActivity) getActivity()).doIt();
在你的MainActivity
中创建一个方法doIt
可能是这样的
public void doIt()
frg2.setName(frg.getText())
并在顶部片段中创建一个方法getText
,它返回 EditText 的文本
【讨论】:
以上是关于在单个活动中动态实现多个片段的主要内容,如果未能解决你的问题,请参考以下文章