Fragment自学 动态加载Fragment 以及如何获取动态加载的fragment中的控件

我是一只自学java以及安卓2个月的菜鸟程序员,目前暂时学到Fragment,踩了无数个坑~~~

在网上看了无数的fragment与activity交互的文章,对于我这样的java初学者来说,还是有点困难,经过了一天多的困难,终于理解了,分享给大家,我是菜鸟 轻喷。。。


强调一个,从fragment传送数据到activity,需要通过接口回调才能实现,但是activity传送数据到fragment比如在activity内要改变某一个fragment的中某一个控件的值,

可以直接在fragment中定义一个方法

public   void setText(String s) {

    textView.setText(s);
}

通过直接调用的方法就可以实现,不需要再用接口回调

对象命.setText(s);


我这里是titlefragment1,contentfrgment1(因为之前写过一次,各种报错,重写了,又懒得新建工程,直接后面+了个1) main3avtivity 三个布局

Fragment自学 动态加载Fragment 以及如何获取动态加载的fragment中的控件_第1张图片Fragment自学 动态加载Fragment 以及如何获取动态加载的fragment中的控件_第2张图片Fragment自学 动态加载Fragment 以及如何获取动态加载的fragment中的控件_第3张图片

Fragment自学 动态加载Fragment 以及如何获取动态加载的fragment中的控件_第4张图片

如上面图片,我要实现的是在titlefrgment点击一个按钮。通过main3activity 传送数据,改天contextfragment中textview中的值

两个button按钮在titlefragment中,右边的textview在contextfrgment中。

参数回调的接口,我想大家可以通过很多网上的文章学习到,我也是看了好久,毕竟基础不好,慢慢理解吧。


在按钮发生事件的fragment即titlefragment中定义一个接口

public  interface TitleFragmentOnclickListener {
     void ChangeValue(String s);
}


然后在main3activity中实现你的接口

@Override
public void ChangeValue(String s)
{
    contentFragment1= (ContentFragment1) getFragmentManager().findFragmentById(R.id.content_layout);
    contentFragment1.setText(s);
}
大家注意了 坑就在这里。

我的两个fragment是动态添加的

public void AddTitleFragment(){

    FragmentManager fm=getFragmentManager();
    FragmentTransaction ft=fm.beginTransaction();
    ft.replace(R.id.title_layout,titleFragment1);
    ft.replace(R.id.content_layout,contentFragment1);
    ft.commit();

}

注意了这个是错误的!!!!

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);
    AddTitleFragment();
    contentFragment1= (ContentFragment1) getFragmentManager().findFragmentById(R.id.content_layout);
    
}
刚开始我在oncreate的时候先动态添加fragment,然后直接在这里获取了contentfragment所以的framlayout,导致最后在调用settext的时候 一直出现null object

 contentFragment1= (ContentFragment1) getFragmentManager().findFragmentById(R.id.content_layout);
然后我把这句话放到了接口实现中,才没有出现空值的问题,其实就是当按钮点击的时候再去获取对象,具体原因我也无法解释,,,我还是菜鸟!!

@Override
public void ChangeValue(String s)
{
    contentFragment1= (ContentFragment1) getFragmentManager().findFragmentById(R.id.content_layout);
    contentFragment1.setText(s);
}

把三个布局文件也给你们吧。。

xml version="1.0" encoding="utf-8"?>
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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.rkq.gamermaster.Main3Activity">

            android:id="@+id/title_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2">
    

            android:id="@+id/content_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3">
    



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

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

    

你可能感兴趣的:(android菜鸟自学)