Android Fragment之间传值

首先来介绍的是我们的默认的布局

    

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.chuang.frgone"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent" />

    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.chuang.frgtwo"
         android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

</LinearLayout>

需要注意的属性也就fragment中的那个name属性,这个属性很关键,作用就是在这个布局被加载时,fragment自动实例化对应的类

既然要加载两个类文件,所以就必须加载对应的布局,

fragment_one   的布局文件:

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

    <ListView
        android:id="@+id/ls_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

fragment_two   的布局文件:

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

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

然后我们需要做的就是将布局文件和类进行绑定

package com.example.chuang;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class frgtwo extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment_two, container);
    }
}

其他的绑定也是类似的,运行的效果如下图,在这里为你看清楚,我在Fragment_one中添加了背景颜色,

为了方便测试,我们定义了如下的字段

package com.example.chuang;

import java.util.ArrayList;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class frgone extends Fragment {
private ListView ls=null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_one, container);
        ls=(ListView)v.findViewById(R.id.ls_show);
        ls.setAdapter(new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,GetArray()));
        return v;

    }
    private ArrayList<String> GetArray()
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("我就是我");
        al.add("点亮我的新");
        al.add("你的心,我的鑫");
        return al;
    }
}

效果图如下

那现在我们要做的呢就是在左边点击,右边显示,也就是实现Fragment之间的传值

第一种方法,也就是利用回调

package com.example.chuang;

import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class frgone extends Fragment {
private CallBack back=null;
private ListView ls=null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_one, container);
        ls=(ListView)v.findViewById(R.id.ls_show);
        ls.setAdapter(new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,GetArray()));
        ls.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if(back!=null)
                {
                    back.SetTeee(String.valueOf( parent.getItemAtPosition(position)));
                    //back.SetTeee(getString(getId()));
                }
            }

        });
        return v;
    }
    private ArrayList<String> GetArray()
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("我就是我");
        al.add("点亮我的新");
        al.add("你的心,我的鑫");
        return al;
    }
public interface CallBack
{
    void SetTeee(String s);
}
@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if(activity instanceof CallBack)
        {
            back=(CallBack)activity;
        }
    }
}

然后是主Activity的代码

    @Override
    public void SetTeee(String s) {
        View v= this.findViewById(R.id.fragment2);
        TextView t=(TextView)v.findViewById(R.id.tv_show);
        t.setText(s);
    }

效果图如下,这样我们就实现了第一种方法

 

第二种方法

使用第二种方法,我们首先需要来了解一下Fragment 和Activity的生命周期

  我们可以根据上面的那个图,可以知道,只有当fragment创建完毕,活动就会通知他们调用onActivityCreated()方法,来告知

  所以我们就可以在这里获取到主活动里面的一切,不是想干嘛就干嘛吗0-0!

贴上代码

package com.example.chuang;

import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class frgone extends Fragment {
private CallBack back=null;
private ListView ls=null;
private TextView tv=null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_one, container);
        ls=(ListView)v.findViewById(R.id.ls_show);
        ls.setAdapter(new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,GetArray()));
        ls.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if(back!=null)
                {
                    if(tv!=null)
                    tv.setText(String.valueOf( parent.getItemAtPosition(position)));
                }
            }

        });
        return v;
    }
    @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
        View v=    getActivity().findViewById(R.id.fragment2);
        tv=((TextView)v.findViewById(R.id.tv_show));

        }
    private ArrayList<String> GetArray()
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("我就是我");
        al.add("点亮我的新");
        al.add("你的心,我的鑫");
        return al;
    }

第三种方法,那就是在Activity中来管理两个Fragment,当然做法也是非常的简单,只需要在Activity的start生命周期后就可以

时间: 2024-08-05 05:07:45

Android Fragment之间传值的相关文章

[转][译][Android基础]Android Fragment之间的通信

2014-2-14 本篇文章翻译自Android官方的培训教程,我也是初学者,觉得官方的Training才是最好的学习材料,所以边学边翻译,有翻译不好的地方,请大家指正. 如果我们在开发过程中为了重用Fragment这个UI组件,那么我们应该把Fragment设计成是“自包含”.“模块化”组件,这种组件定义自己的布局和行为.一旦我们成功定义了这样的可重用的Fragment,我们就可以将他们与Activity进行关联,然后与整个Application进行整体的UI组装. 我们经常需要一个Fragm

Android - fragment之间数据传递

<Fragment跳转时传递参数及结果回传的方法> <Fragment详解之五——Fragment间参数传递> <Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数> <详解Dialog(三)——自定义对话框视图及参数传递> 原文地址:https://www.cnblogs.com/qlky/p/10630107.html

Android activity之间传值

当对Android有一些了解后,不难发现,Android程序UI框架接近于Web页面的概念.每一个用于呈现页面的组件,Activity,都是彼此独立的,它们通过系统核心来调度整合,彼此之间的通过Intent机制来串联. 每一种架构都会有其利弊,Android当然也不能超然脱俗.由于Activity之间的松耦合关系,使得其复用能力特别的出色,Mash-Up方式可以有效的提高开发效率.但另一方面,由于Activity过于的独立,它们之间的数据共享,成为一个麻烦的事情. 一 基于消息的传输 最标准的A

Android fragment之间消息传递

1. 在Fragment里定义一个内部接口, 在Fragment初始化方法里, 把父Activity转换成这个接口, 赋值给成员变量 public class DummyFragment extends ListFragment { SomeEventListener listener; public interface SomeEventListener { public void onSomeEvent(int arg); } @Override public void onAttach(A

Android activity之间传值关键性代码

从当前activity中获取et 表单中的值,并跳转到myactivity.java所绑定的xml布局文件上. private EditText et; Intent intent=new Intent(MainActivity.this,myactivity.class); String str=et.getText().toString(); intent.putExtra("name", str); startActivity(intent); myactivity.java所绑

Fragment之间传值

Activity: String myArguments;    public String getarguments() {   return myArguments;  } public void setarguments(String title) {   this.myArguments = title;  } http://www.cnblogs.com/xiaobo-Linux/ qq463431476 Afragment: ((MainActivity)getActivity())

Android——软键盘操作+fragment之间传递参数

原文地址: Android 手动显示和隐藏软键盘 Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果) Android Fragment传递参数_Fragment之间传值的两种方法

Android - Fragment (三)不同Fragment之间的通信

在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentManager().findFragmentById(R.id.fragment_list); 但这样做耦合度太高,不方便后续的修改操作 Fragment与其附着的Activity之间的通信,都应该由Activity来完成 不能是多个Fragment之间直接通信 Fragment与其附着的Activi

Android——Fragment和Activity之间的通信+Frangment生命周期

Android--Fragment和Activity之间的通信+Frangment生命周期 Fr'agment和Activity之间的通信 1.在Fragment中声明一个接口. 2.在Activity中实现在Fargment中声明的接口. 3.在Fragment中声明一个接口对象. 4.在Frangment的生命周期Onattach方法中判断当前Activity是否实现了此Fragment中声明的接口.如果已实现,就把当前Activity转换成接口对象. 5.调用Activity中实现的方法=