Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解
来源:互联网 发布:刷指数软件 编辑:程序博客网 时间:2024/05/18 18:46
若想在点击条目的时候通过setarguments 传值必须在事务提交此fragment之前setarugments
否则会报空指针因为getarguments找不到值所以可通过方法回调来传值 另外,也可通过在点击条目的
时候调用activity中的方法
此方法中进行添加fragment到framlayout并提交事务在此方法的参数中传入我们要传递的值
在viewpager和fragment一起使用时并不知道fragment在什么时候被初始化
所以通过方法回调来传值(但是只能从mainactivity往fragment中传值)因为找不到初始化的那个fragment
或者通过静态方法来传值在添加fragment到布局中时候可知道
fragment是在提交事务的时候被初始化所以可通过在提交事务之前通过setarguments
和getarguments来传值动态加载同样可通过方法回调来传值在new fragment的时候
添加进布局的方法中选择带3个参数的最后一个参数是tag这样当找到的时候可以通过
(mainactivity)getactivity.getsupportfragmentmanager.getfragmentbytag来
找到对应的fragment这样就是找到了初始化的fragment然后通过方法回调来传值
(方法回调步骤)在需要传值的类中定义一个接口和一个公共方法此公共方法中的参数是接口
在this.接口=接口 中将成员变量的接口赋值(即把要调用此公共方法并实现此接口的对象返回到它身上)
在需要传值的方法体中接口.方法 在接收参数的类中找到要传值的初始化对象 然后让此对象.公共方法
并实现此接口参数,在重写的方法中获取传过来的值
有多态的思想,动态绑定,依赖倒置
多态 :父类引用指向子类对象 重写 继承
接口指向实现对象 重写 实现
!!! 当我们用接口回调方法在fragment与fragment之间传值的时候记得一定要在与fragment产生关联的activity的oncreate方法中
去提交(commit)fragment 因为commit属于费时操作若不提前提交会造成空指针异常
public class MainActivity extends FragmentActivity {
private FragmentManager supportFragmentManager;
private Fragment1 f1;
private Fragment2 f2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
f1 = new Fragment1();
f2 = new Fragment2();
supportFragmentManager = getSupportFragmentManager();
FragmentTransaction beginTransaction = supportFragmentManager.beginTransaction();
beginTransaction.add(R.id.framelayout, f1, "f1");
beginTransaction.add(R.id.framelayout, f2, "f2");
beginTransaction.show(f2);
beginTransaction.hide(f1);
Bundle bundle = new Bundle();
bundle.putString("key", "asdgasdg");
f1.setArguments(bundle);
beginTransaction.commit();
}
public void show3(){
FragmentTransaction beginTransaction = supportFragmentManager.beginTransaction();
beginTransaction.show(f1);
beginTransaction.hide(f2);
beginTransaction.addToBackStack("");
beginTransaction.commit();
}
public class Fragment2 extends Fragment{
private ListView lv;
private ArrayList<String> liststr;
private Pass pass;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment2, null);
lv = (ListView) view.findViewById(R.id.lv);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
liststr = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
liststr.add("天空"+i);
}
lv.setAdapter(new Myadapter());
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
TextView lvtv = (TextView) view.findViewById(R.id.lvtv);
pass.fun(lvtv.getText().toString());
}
});
}
interface Pass{
void fun(String str);
}
public void pass_value(Pass pass){
this.pass = pass;
}
private class Myadapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return liststr.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = View.inflate(getActivity(), R.layout.listview_item, null);
TextView lvtv = (TextView) view.findViewById(R.id.lvtv);
lvtv.setText(liststr.get(position));
return view;
}
}
public class Fragment1 extends Fragment{
private TextView f1tv;
private MainActivity main;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment1, null);
f1tv = (TextView) view.findViewById(R.id.f1tv);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
main = (MainActivity) getActivity();
Bundle arguments = getArguments();
Log.e("sgdsdg", arguments.getString("key"));
Fragment2 f2 = (Fragment2) main.getSupportFragmentManager().findFragmentByTag("f2");
f2.pass_value(new Pass() {
@Override
public void fun(String str) {
// TODO Auto-generated method stub
f1tv.setText(str);
main.show3();
}
});
}
下面代码为接口回调必须提交的代码只粘一个fragment解释其余一样
public class CarttoonsortFragment extends BaseFragment{
private ListView lv;
private CartBook cb;
private ArrayList<String> list;
@Override
public View initViews() {
// TODO Auto-generated method stub
View view = View.inflate(activity, R.layout.carttoonsortfragment, null);
lv = (ListView) view.findViewById(R.id.carttoonsortfrag_lv);
return view;
}
@Override
public void initDatas() {
// TODO Auto-generated method stub
getDataFromNet();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
CartToonActivity mactivity = (CartToonActivity) activity;
TextView tv = (TextView) arg1.findViewById(R.id.leftfrag_lv_tv);
if(cb==null){
Toast.makeText(mactivity, "空指针", 0).show();
}else{
cb.pass(tv.getText().toString());
}
FragmentManager manager = mactivity.getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
CarttoonsortFragment sortfrag = (CarttoonsortFragment) manager.findFragmentByTag("carttoonsortFragment");
CarttoonlistFragment listfrag = (CarttoonlistFragment) manager.findFragmentByTag("CarttoonlistFragment");
trans.hide(sortfrag);
trans.show(listfrag);
trans.addToBackStack("2");
trans.commit();
}
});
}
private void getDataFromNet() {
// TODO Auto-generated method stub
HttpUtils utils = new HttpUtils();
utils.send(HttpMethod.GET, "http://japi.juhe.cn/comic/category?key=7adb2d7bceb254a778afb248e2742aab", new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(activity, "网络加载失败", 0).show();
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
// TODO Auto-generated method stub
String result = arg0.result;
parseData(result);
}
});
}
private class Mylistviewadapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
arg1 = View.inflate(activity, R.layout.leftfragment_listview_item, null);
TextView tv = (TextView) arg1.findViewById(R.id.leftfrag_lv_tv);
tv.setText(list.get(arg0));
return arg1;
}
}
protected void parseData(String result) {
// TODO Auto-generated method stub
Gson gson = new Gson();
CarttoonSort sort = gson.fromJson(result, CarttoonSort.class);
list = sort.result;
lv.setAdapter(new Mylistviewadapter());
}
public void passValueBook(CartBook cb){
this.cb = cb;
}
public interface CartBook{
public abstract void pass(String str);
}
}
public class CartToonActivity extends FragmentActivity {
private FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_cart_toon);
manager = getSupportFragmentManager();
CarttoonsortFragment carttoonsortFragment = new CarttoonsortFragment();
CarttoonlistFragment carttoonlistFragment = new CarttoonlistFragment();
CarttoonchapterFragment carttoonchapterFragment = new CarttoonchapterFragment();
CarttoonDetailFragment carttoonDetailFragment = new CarttoonDetailFragment();
FragmentTransaction trans = manager.beginTransaction();
//搞不清下个replace为什么改成add会出现页面重叠因为没点击mainactivity中的跳转
//时此activity没有实例化理应没走此处代码
/**后来查阅资料得知
* 当你点击run或者RUN as -Android appliction,程序就开始运行加载了
* 所以此activity早就被加载因为过早被加载导致
* mainactivity中的页面和此actvity中的页面重叠
* mainactivity中的viewpager没有被及时destroy掉致使
* viewpager滑动时页面重叠而造成这一原因的就是事务的add
*/
trans.replace(R.id.carttoon_activity_fl, carttoonsortFragment, "carttoonsortFragment");
trans.add(R.id.carttoon_activity_fl, carttoonlistFragment, "CarttoonlistFragment");
trans.add(R.id.carttoon_activity_fl, carttoonchapterFragment, "carttoonchapterFragment");
trans.add(R.id.carttoon_activity_fl, carttoonDetailFragment, "carttoonDetailFragment");
trans.show(carttoonsortFragment);
trans.hide(carttoonchapterFragment);
trans.hide(carttoonDetailFragment);
trans.hide(carttoonlistFragment);
trans.addToBackStack("1");
trans.commit();
/**!!!!!记得所有fragment都要提交
* 先提交事务才能接口回调一般我们提交是在oncreate中也可以在用户输入的时候
* 但是我的项目中想要在用户输入的时候不只commit而且要接口回调这就造成了空指针因为commit会耗时
* 当我用setarguments一样报空指针当我们想要在activity和fragment之间传值和fragment和fragment之间
* 传值的时候必然依赖于activity所以我们在activity和fragment之间传值的时候用setarguments而当我们在fragment
* 和fragment之间传值的时候用接口回调而fragment要在最好在oncreate中去提交(防止空指针)
*/
}
- Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解
- Activity与Fragment之间的传值
- Activity与Fragment之间的传值
- Activity与Fragment之间的传值
- Activity与Fragment,以及Fragment与Fragment之间的数据通讯
- Activity与Activity,Activity与Fragment及Fragment与Fragment之间传值
- Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
- Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
- Fragment与Activity之间传值
- Fragment与Activity之间传值
- Android之---Activity与Fragment之间的传值问题
- Activity与fragment之间的传值:fragment的setArguments()和getArguments()
- Activity与Fragment,Fragment与Fragment之间的通信
- Activity与Fragment的相互传值
- Fragment与Activityz之间的传值
- fragment之fragment与activity通讯以及fragment之间的通讯
- Android 关于Fragment与Activity之间传值
- Fragment与Activity的理解
- HTTP协议详解
- springAOP入口之AopNamespaceHandler
- 利用adb访问sqllite中的数据库
- Delphi中MD5实现方法(转)
- JAVA EE-HTTP
- Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解
- 2017年爱奇艺校招Java研发笔试编程题(2个)
- Java程序猿之网络编程实现(30)
- 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- First try play Git!Windows(update)萌新的摸爬滚打之路
- mysql yum源头
- 异常的深入研究与分析(1)
- 如何为Apache JMeter开发插件(五)——监听器之Report (报告)
- 查看Postgresql的连接状况