Fragment以及关于Activity和Fragment之间的
2018-12-23 本文已影响0人
晨曦诗雨
image.png
image.png
image.png
image.png
image.png
加载方式有俩种
-
静态加载
动态加载 - dongtaij
-
动态加载
image.png
使用事物
与Activity的通信
Activity给Fragment传递数据值
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/layout"
android:layout_height="match_parent"
>
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"/>
</LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText edit_text;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_text=(EditText) findViewById(R.id.edit_text);
button=(Button)findViewById(R.id.send);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String text=edit_text.getText().toString();
// Intent i=new Intent(this,SecondActivity.class);
// startActivity(i);
MyFragment myFragment=new MyFragment();
Bundle bundle=new Bundle();
//绑定数据
bundle.putString("name",text);
myFragment.setArguments(bundle);
// 使用动态加载
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.layout,myFragment,"fragment_first");
fragmentTransaction.commit();
Toast.makeText(MainActivity.this,"向Frangment发送数据",Toast.LENGTH_SHORT).show();
}
}
fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MyFragment
public class MyFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_first,container,false);
TextView textView=(TextView)view.findViewById(R.id.text);
// textView.setText("第一个fragment");
//接受传递的值
String text=getArguments().getString("name");
textView.setText(text);
Toast.makeText(getActivity(),"已成功接受text内容"+text,Toast.LENGTH_SHORT).show();
return view;
}
}
Fragment给Activity传递数据值
再MyFragment里添加一个接口方法,并在MainActivity里实现接口方法
MyFragment
public class MyFragment extends Fragment {
private String code="好好啊哦哦啊哦好好";
public MyListener listener;
public interface MyListener{
public void thank(String code);
}
//当fragment被添加进来调用
@Override
public void onAttach(Activity activity) {
listener=(MyListener)activity;
super.onAttach(activity);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_first,container,false);
TextView textView=(TextView)view.findViewById(R.id.text);
// textView.setText("第一个fragment");
//接受传递的值
String text=getArguments().getString("name");
textView.setText(text);
Toast.makeText(getActivity(),"已成功接受text内容"+text,Toast.LENGTH_SHORT).show();
Toast.makeText(getActivity(),"向activity发送消息"+text,Toast.LENGTH_SHORT).show();
listener.thank(code);
return view;
}
}
MainActivity
@Override
public void thank(String code) {
Toast.makeText(this,"成功接收到标语"+code,Toast.LENGTH_SHORT).show();
edit_text.setText(code);
}
image.png
Fragment和Activity的交互:
1、在Fragment中调用Activity中的方法:
Fragment可以通过getActivity()方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。例如:
View listView = getActivity().findViewById(R.id.list);
但是注意调用getActivity()时,fragment必须和activity关联(attached to an activity),否则将会返回一个null。
另外,当碎片中需要使用Context对象时,也可以使用getActivity()方法,因此获取到的活动本身就是一个Context对象。
在Activity中调用Fragment中的方法:(要用到接口回调)
activity也可以获得一个fragment的引用,从而调用fragment中的方法。获得fragment的引用要用FragmentManager,之后可以调用findFragmentById() 或者 findFragmentByTag()。例如:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
也可以通过接口回调的方式来进行fragment给activity传值