Fragment是一个Activity片段,必须嵌套在Activity中,有自己的生命周期,但又依赖于父Activity的生命周期。
创建一个Fragment
1)静态加载Fragment
实现流程:
2)动态加载Fragment
实现流程:
Fragment与Activity的交互
可能有的朋友不喜欢看图,接下来用文字介绍下吧:
1)组件获取
Fragment获得Activity中的组件: getActivity().findViewById(R.id.list);
Activity获得Fragment中的组件(根据id和tag都可以):getFragmentManager.findFragmentByid(R.id.fragment1);
2)数据传递
①Activit传递数据给Fragment:
在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle)从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得Bundle对象,然后进行解析就可以了
②Fragment传递数据给Activity
在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,Fragment就可以通过回调接口传数据了,回调,相信很多人都知道是什么玩意,但是写不出来啊,网上的一百度"fragment传数据给Activity",全是李刚老师的那个代码,真心无语算了,这里就写下局部代码吧,相信读者一看就懂的了:
Step 1:定义一个回调接口:(Fragment中)
/*接口*/ public interface CallBack{ /*定义一个获取信息的方法*/ public void getResult(String result); }
Step 2:接口回调(Fragment中)
/*接口回调*/ public void getData(CallBack callBack){ /*获取文本框的信息,当然你也可以传其他类型的参数,看需求咯*/ String msg = editText.getText().toString(); callBack.getResult(msg); }
Step 3:使用接口回调方法读数据(Activity中)
/* 使用接口回调的方法获取数据 */ leftFragment.getData(new CallBack() { @Override public void getResult(String result) { /*打印信息*/ Toast.makeText(MainActivity.this, "-->>" + result, 1).show(); } });
总结下方法:->在Fragment定义一个接口,接口中定义抽象方法,你要传什么类型的数据参数就设置为什么类型;
->接着还有写一个调用接口中的抽象方法,把要传递的数据传过去
->再接着就是Activity了,调用Fragment提供的那个方法,然后重写抽象方法的时候进行数据的读取就可以了!!!
实例如下:
MainActivity.java的代码如下:
package com.deepreality.fragmentdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button btnShowFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载静态Fragment
//setContentView(R.layout.activity_main);
//加载动态Fragment布局
setContentView(R.layout.activity_main_dynamicfragment);
//以下是动态加载Fragment的代码
btnShowFragment = findViewById(R.id.main_btnShowFragment);
getFragmentManager().beginTransaction().add(R.id.main_lLayout, new DynamicFragmentOne()).commit();
btnShowFragment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.main_lLayout, new DynamicFragmentTwo()).commit();
}
});
}
}
DynamicFragmentOne.java的代码如下:
package com.deepreality.fragmentdemo;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class DynamicFragmentOne extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_dynamicfragment_one, container, false);
return view;
}
}
其他相关的代码和布局,自行补充。