activity,fragment数据交换, 平常总是使用到activity和fragment, 所以必须得搞懂他们怎样传值。
activity传值给fragment 据我所知。 大概有这么几种方式 构造函数传值, setargment传值,get set方法传值,广播传值,回调传值以及静态字段传值
对于这几种方式, 我推荐用setargment方式, 谷歌表示不建议构造函数传值, ,回调太费事, 广播也不推荐,杀鸡焉用牛刀,广播是处理组件的通信的。
先说说setargments.方式
Button是用于回调的使用。 现在可以当做没看到, 后面我会讲到. main布局中有个viewpager,
<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" tools:context="com.example.administrator.activityfragment.MainActivity"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:id="@+id/viewpager" android:layout_height="500dp"></android.support.v4.view.ViewPager> <Button android:layout_width="wrap_content" android:text="传值" android:id="@+id/btn" android:layout_height="wrap_content" /> </LinearLayout>
activity部分代码。 没写全, 不过应该看得懂, 里面自己写了个2个fragment和一个 FragmentAdapter
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); viewPager= (ViewPager) findViewById(viewpager); btn= (Button) findViewById(R.id.btn); list=new ArrayList<Fragment>(); Fragment1 fragment1=new Fragment1(); Fragment2 fragment2=new Fragment2(); list.add(fragment1); list.add(fragment2); viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(),list));
fragment 1 和framgnet 2 没什么区别。 我贴一个代码就行了
这个fragment布局就不贴了。 布局中就一个textview控件 这里我先不讨论bundle和main的作用
TextView tv; MainActivity main; Bundle bundle; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment1_layout,null); initView(view); return view; } private void initView(View view) { tv= (TextView) view.findViewById(R.id.text); main= (MainActivity) getActivity(); bundle=getArguments();好了。 大概就是这样, 我们回到Activity中。代码不贴了, 上面activity中我贴过, 里面实例化了两个fragment, 然后通过一个list集合传到adapter,然后viewpager填充这个adapter,activity代码中, 我们通过fragment1对象调用了.setArguments();方法, 参数为bunlde, 所以我们创建了个bundle,bundle内部是key-values,的形式存储数据, 键名我给的"傻逼",值是sb,protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); viewPager= (ViewPager) findViewById(viewpager); btn= (Button) findViewById(R.id.btn); list=new ArrayList<Fragment>(); Fragment1 fragment1=new Fragment1(); Fragment2 fragment2=new Fragment2(); list.add(fragment1); list.add(fragment2); viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(),list)); Bundle bundle=new Bundle(); bundle.putString("傻逼","sb"); fragment1.setArguments(bundle)回到fragment1代码中, 我们通过getargment方法来获取一个buldle对象,然后通过budle对象给textview赋值。public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragment1_layout,null); initView(view); return view; } private void initView(View view) { tv= (TextView) view.findViewById(R.id.text); main= (MainActivity) getActivity(); bundle=getArguments();tv.setText(bundle.getString("傻逼"));现在运行下程序。可以看到sb 的数据传过来的, 这是第一种。然后第二种。 构造函数传值在fragment1中给个构造函数带个string参数public class Fragment1 extends Fragment { public String data; public void Fragment1(String data) { this.data=data; }然后在activity中 实例化fragment1 将你需要的数据传过去,Fragment1 fragment1=new Fragment1("构造函数传值");然后在fragment中把data数据给textview控件tv.setText(data);现在运行下程序, 不知道为啥。 图片贴不了, 你们可以自己调试结果就知道了。在你使用这种方法的时候, fragment会有红色下划线出现,光标移上去会显示一段文字,大概意思是讲不推荐用构造来传值, 因为fragment会自动默认构造函数,推荐使用argments第三种。 就是通过回调传值说到回调, 此时button按钮就起作用了。实例化button 这个不要我讲了吧。 然后然后创建个接口,和接口对象。 然后创建个方法,把接口对象赋给自己创建的接口interface Ballcak { public void back(String str); } Ballcak ballcak=null; public void setballback(Ballcak ballcak ) { this.ballcak=ballcak; }在button的onclick中调用back(String str);方法btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ballcak.back("我去。 你是sb"); } });然后在fragment中。 通过getactivity得带activity对象。main= (MainActivity) getActivity();
然后通过这个main对象来调用setballback();方法main.setballback(new MainActivity.Ballcak() { @Override public void back(String str) { tv.setText(str+".."); } });点击运行程序。 textview的值就是我去。 你是sb
后面的几种。 可以自己去试一试, 比较简单。 这里我就不啰嗦了。