学堂 学堂 学堂公众号手机端

Android :(使用fragment碎片)——让你的应用更灵活(二)数据通信

lewis 1年前 (2024-04-15) 阅读数 19 #技术


Fragment的三种通信

fragment之间的通信包含了fragment之间的通信,Activity——>frament的通信以及fragment—>Activity的数据通信。这三种通信中第三个比较难,不论简单还难先说下思路吧。

思路:

1、fragment1——fragment2:在fragment1 中写一个公共的方法来获得我们需要的数据,将得到的数据再fragment2 中进行调用或使**用。
2、Activity——>frament:activity先fragment传递数据需要通过Bundle,再通过fragment.setArguments(Bundle)方法来将数据传递给fragment,fragment部分通过getArguments()获得数据。
发送


new Bundle();
bundle.putString("data", text);
MyFragment myfragment = new

获取

String text=getArguments().get("data")+"";

3、fragment—>Activity:通过在fragment内部实现一个内部回调接口,并在包含该fragment的activity中实现该回调接口,这样fragment就可以通过调用该接口向activity传递数据了。

1、fragment间通信

public class MainActivity extends FragmentActivity implements OnClickListener
private FragmentManager fragment;
private FragmentTransaction beginTransaction;
private FrameLayout mframe;
private Button mbtn1;
private Button mbtn2;
private Button mbtn3;
private MyFirstFragment myFirstFragment;
private MySecondFragment mySecondFragment;
private MyThirdFragment myThirdFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mframe = (FrameLayout) findViewById(R.id.frame);
mbtn1 = (Button) findViewById(R.id.button1);
mbtn2 = (Button) findViewById(R.id.button2);
mbtn3 = (Button) findViewById(R.id.button3);
mbtn1.setOnClickListener(this);
mbtn2.setOnClickListener(this);
mbtn3.setOnClickListener(this);
//fragment 的动态加载
fragment = getSupportFragmentManager();
beginTransaction = fragment.beginTransaction();
myFirstFragment = new MyFirstFragment();
mySecondFragment = new MySecondFragment();
myThirdFragment = new MyThirdFragment();
beginTransaction.add(R.id.frame, myFirstFragment);
beginTransaction.add(R.id.frame, mySecondFragment);
beginTransaction.add(R.id.frame, myThirdFragment);
beginTransaction.hide(myFirstFragment);
beginTransaction.hide(mySecondFragment);
beginTransaction.commit();
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1: {
beginTransaction = fragment.beginTransaction();
beginTransaction.addToBackStack(null);
beginTransaction.hide(myThirdFragment);
beginTransaction.hide(mySecondFragment);
beginTransaction.show(myFirstFragment);
beginTransaction.commit();
}

break;
case R.id.button2: {
beginTransaction = fragment.beginTransaction();
String s = myThirdFragment.gettext();
beginTransaction.addToBackStack(null);
beginTransaction.hide(myThirdFragment);
beginTransaction.hide(myFirstFragment);
beginTransaction.show(mySecondFragment);
mySecondFragment.settext(s);
beginTransaction.commit();
}
break;
case R.id.button3: {
beginTransaction = fragment.beginTransaction();

beginTransaction.hide(myThirdFragment);
beginTransaction.hide(myFirstFragment);
beginTransaction.show(myThirdFragment);
beginTransaction.addToBackStack(null);
beginTransaction.commit();
}
break;
default:
break;
}
}
}
2、Activity—>fragment通信

演示:将fragment布局动态加载到activity中,通过Bundle将输入的内容展示到fragment的TextView上面。


代码:

MainActivity布局采用LinearLayout(@+id/layout)内包含一个Button和EditText,MyFragment中布局只有一个TextView。

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
String text = met_text.getText().toString();
//设置传递数据
Bundle bundle = new Bundle();
bundle.putString("data", text);//键值对形式存储
MyFragment myfragment = new MyFragment();
myfragment.setArguments(bundle);//通过该方法传递数据
//动态加载fragment
FragmentManager fragmentmanager = getFragmentManager();
FragmentTransaction beginTransation = fragmentmanager.beginTransaction();
beginTransation.add(R.id.layout, myfragment);
//记得提交
beginTransation.commit();

break;

default:
break;
}

}

Fragment获取数据

public class MyFragment extends Fragment{
private TextView textview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.item_myfragment, container, false);
textview=(TextView) view.findViewById(R.id.textview);
//获取数据将数据展示到TextView上面
String text=getArguments().get("data")+"";
textview.setText(text);
return
3、fragment—>Activity通信

fragment向Activity的通信我们分为动态加载fragment的通信与静态加载fragment的通信。

静态加载的fragment与activity的通信


1、在布局中静态加载fragment,注意给出name与id

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"

<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"

<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"

<fragment
android:id="@+id/fragmentjingtai"
android:name="com.example.myfragment.MyFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

</LinearLayout>

2、在fragment中设置传输数据的set\get方法(用于在静态加载时调用中)

public class MyFragment extends Fragment{
private Button button;
private TextView textview;
//传输的数据
private String text;
//set get方法
public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.item_myfragment, container, false);
textview=(TextView) view.findViewById(R.id.textview);
button=(Button) view.findViewById(R.id.button_Myfragment);
//点击按钮时获取数据并通过Toast显示
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
String value=getText();
Toast.makeText(getActivity(), "fragment发送的text数据:"+value,Toast.LENGTH_SHORT).show();

}
});
return

3、在mainActivity中通过点击按钮找到fragment,通过fragment发送数据

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:

FragmentManager fragmentmanager = getFragmentManager();
//通过id获取Fragment
Fragment fragmentById=fragmentmanager.findFragmentById(R.id.fragmentjingtai);
//将Fragment强制造型成Myfragment
MyFragment myfragment=(MyFragment) fragmentById;
myfragment.setText("fragment静态传递的数据:");
break;

default:
break;
}

}
动态加载的fragment与activity的通信

 


1、我们现在fragment中实现内部接口

public class MyFragment extends Fragment{

private TextView textview;
public String words="hello,Activity";
//用于获取activity对象,传递数据
public MyListener listener;
//在fragment中实现内部接口
public interface MyListener
//抽象方法
public void hello(String words);
}
@Override
public void onAttach(Activity activity) {
//获取activity对象
listener=(MyListener) activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.item_myfragment, container, false);
textview=(TextView) view.findViewById(R.id.textview);
//Toast中的context使用getActivity()获得
Toast.makeText(getActivity(), "fragment正在发送数据:"+words,Toast.LENGTH_SHORT).show();
//发送数据,在布局被加载,执行onCreateView的时候会向activi发送数据
listener.hello(words);
return

2、MainActivity中调用该接口(我们在fragment中创建的MyListener)

public class MainActivity extends Activity implements OnClickListener ,MyListener{
private EditText met_text;
private Button mbtn_send;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_send);
mbtn_send = (Button) findViewById(R.id.btn_send);
met_text = (EditText) findViewById(R.id.edittext);
mbtn_send.setOnClickListener(this);

}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
//按钮点击时,动态加载布局
MyFragment myfragment = new MyFragment();
FragmentManager fragmentmanager = getFragmentManager();
FragmentTransaction beginTransation = fragmentmanager.beginTransaction();
beginTransation.add(R.id.layout, myfragment);
beginTransation.commit();

break;

default:
break;
}

}
//fragment中调用listener.hello(words)时会调用该方法
@Override
public void hello(String words) {
Toast.makeText(getApplicationContext(), "Activity已经接收到数据"+words, Toast.LENGTH_SHORT).show();
}

}


版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门