转载请注明出处:Fragment动态添加、及与Activity数据传递_Mr_Leixiansheng的博客-CSDN博客
1、Fragment静态添加 : Fragment静态添加_android 添加两个fragment_Mr_Leixiansheng的博客-CSDN博客
2、Fragment动态添加 : Fragment动态添加、及与Activity数据传递_Mr_Leixiansheng的博客-CSDN博客
步骤:(前两步与静态添加相同)
1、添加fragment_1、fragment_2的 xml文件,设置好显示内容
2、新建Fragment1、Fragment2两个类、重写 onCreateView (注意:导入的Fragment包一定要对应,否则要出错;一旦出错,可以先检查包是否导错)
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_2, container, false);
}
(不同于静态添加处)
3、activity_main.xml布局中添加两个按钮、添加Fragment并加入之前定义的fragment_1、fragment_2(name:全路径名)
4、主程序中动态添加
代码如下:
1、添加fragment_1、fragment_2的 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"
android:background="#aa0000">
<TextView
android:text="This is fragement1"
android:textSize="50dp"
android:textColor="#dd0"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<?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"
android:background="#0000aa">
<TextView
android:text="This is fragement2"
android:textSize="50dp"
android:textColor="#0fe"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2、新建Fragment1、Fragment2两个类、重写 onCreateView
package com.example.administrator.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Administrator on 2017/1/7.
*/
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_1, container, false);
}
}
package com.example.administrator.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Administrator on 2017/1/7.
*/
public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_2, container, false);
}
}
3、activity_main.xml布局中添加两个按钮、添加Fragment
<?xml version="1.0" encoding="utf-8"?>
<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"
android:baselineAligned="false">
<Button
android:id="@+id/btn_show_fragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示Fragment1"/>
<Button
android:id="@+id/btn_show_fragment2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示Fragment2"/>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:name="com.example.administrator.fragment.Fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_1" />
<fragment
android:name="com.example.administrator.fragment.Fragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_2" />
</FrameLayout>
</LinearLayout>
4、主程序中动态添加
package com.example.administrator.fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnLoadFrag1 = (Button) findViewById(R.id.btn_show_fragment1);
btnLoadFrag1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment1);
transaction.commit();
}
});
Button btnLoagFrag2 = (Button) findViewById(R.id.btn_show_fragment2);
btnLoagFrag2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment2 fragment2 = new Fragment2();
transaction.add(R.id.fragment_container, fragment2);
transaction.commit();
}
});
}
}
动态添加Fragment主要包括5步:
1、创建添加碎片实例
2、获取FragmentManager
3、开启事务,beginTransaction();
4、向容器添加碎片
5、commit提交事务
Kotlin写法:
package com.leixiansheng.kotlintest
import android.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
/**
* Created by Leixiansheng on 2018/11/19.
*/
class Fragment1 : Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater!!.inflate(R.layout.fragment_1, container,false)
}
}
package com.leixiansheng.kotlintest
import android.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
/**
* Created by Leixiansheng on 2018/11/19.
*/
class Fragment2 : Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater!!.inflate(R.layout.fragment_2, container,false)
}
}
package com.leixiansheng.kotlintest
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Window
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportRequestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.activity_main)
btn_show_fragment1.setOnClickListener{
val manager = fragmentManager
val transaction = manager.beginTransaction()
transaction.replace(R.id.fragment_container,Fragment1()).commit()
}
btn_show_fragment2.setOnClickListener{
val manager = fragmentManager
val transaction = manager.beginTransaction()
transaction.add(R.id.fragment_container,Fragment2()).commit()
}
}
}
Fragment 与 Activity数据传递
1、Activity 传递数据给Fragment 通过获取到Fragment 对象,再调用其内部方法
1、Fragment 传递数据给 Activity 通过强转 ((xxx) getActivity()),再调用Activity 内部方法
代码如下:
Fragment1与Fragment2相同,只贴一个
public class Fragment1 extends Fragment {
@BindView(R.id.tvContent)
TextView mTvContent;
@BindView(R.id.input)
EditText mInput;
@BindView(R.id.btnSend)
Button mBtnSend;
private Unbinder unbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
unbinder = ButterKnife.bind(this, view);
return view;
}
/**
* 对外暴露方法,获取数据
*
* @param str
*/
public void setText(String str) {
mTvContent.setText(str);
}
@OnClick(R.id.btnSend)
public void onViewClicked() {
//强转 获取到绑定Fragment对应的Activity
String content = mInput.getText().toString();
((MainActivity) getActivity()).setText(content);
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
public class MainActivity extends AppCompatActivity {
@BindView(R.id.btnF1)
Button mBtnF1;
@BindView(R.id.btnF2)
Button mBtnF2;
@BindView(R.id.btnSend)
Button mBtnSend;
@BindView(R.id.etContent)
EditText mEtContent;
private PermissionListener mListener;
private Fragment mFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.btnF1, R.id.btnF2, R.id.btnSend})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btnF1:
showFragment(1);
break;
case R.id.btnF2:
showFragment(2);
break;
case R.id.btnSend:
String content = mEtContent.getText().toString();
//mFragment不为空,且判断是哪个碎片
if (mFragment != null) {
if (mFragment instanceof Fragment1) {
((Fragment1) mFragment).setText(content);
} else if (mFragment instanceof Fragment2) {
((Fragment2) mFragment).setText(content);
}
}
break;
}
}
/**
* 显示界面
* @param page
*/
private void showFragment(int page) {
mFragment = null;
if (page == 1) {
mFragment = new Fragment1();
} else if (page == 2) {
mFragment = new Fragment2();
} else {
return;
}
//获取fragment管理器
FragmentManager manager = getFragmentManager();
//开启事务
FragmentTransaction transaction = manager.beginTransaction();
//设置要显示的fragment界面
transaction.replace(R.id.fragmentLayout, mFragment);
//提交
transaction.commit();
}
/**
* 暴露给Fragment方法,获取数据
*/
public void setText(String str) {
mEtContent.setText(str);
}
}
<?xml version="1.0" encoding="utf-8"?>
<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="horizontal"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/btnF1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="碎片1"/>
<Button
android:id="@+id/btnF2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="碎片2"/>
<EditText
android:id="@+id/etContent"
android:layout_width="80dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传递数据"/>
</LinearLayout>
<FrameLayout
android:id="@+id/fragmentLayout"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"/>
</LinearLayout>