1. 程式人生 > >安卓:Fragment向Fragment傳值的3種方法

安卓:Fragment向Fragment傳值的3種方法

第一種:

主佈局檔案:

<span style="font-size:18px;"><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="horizontal">
	<fragment 
	    android:id="@+id/fg1"
	    android:name="mars.day12_fragmenttofragment.Fragment1"
	    android:layout_height="match_parent"
	    android:layout_weight="1"
	    android:layout_width="0dp"/>
    <LinearLayout
        android:id="@+id/fg2"
        android:layout_height="match_parent"
        android:layout_weight="1" 
        android:layout_width="0dp"
        android:orientation="horizontal">
    </LinearLayout>

</LinearLayout>
</span>
第一個Fragment的佈局檔案
<span style="font-size:18px;"><?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" 
    android:background="#00ff00"
    android:gravity="center">
    <EditText 
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"/>
    <Button 
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="傳送"
        android:textSize="30sp"/>

</LinearLayout>
</span>
第2個Fragment的佈局檔案
<span style="font-size:18px;"><?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" 
    android:background="#0000ff"
    android:gravity="center">
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="接收的內容:"/>
    <TextView 
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"/>

</LinearLayout>
</span>
第1個Fragment的邏輯程式碼檔案
<span style="font-size:18px;">package mars.day12_fragmenttofragment;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

@SuppressLint("NewApi") public class Fragment1 extends Fragment{
	EditText et;
	CallBack call;
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		call=(CallBack) getActivity();
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view=inflater.inflate(R.layout.fragment1,container,false);
		et=(EditText) view.findViewById(R.id.et);
		Button bt=(Button) view.findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
			call.getData(et.getText().toString());	
			}
		});
		return view;
	}
	public interface CallBack
	{
		public void getData(String data);
	}
}
</span>

主邏輯程式碼檔案:

<span style="font-size:18px;">package mars.day12_fragmenttofragment;

import mars.day12_fragmenttofragment.Fragment1.CallBack;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.view.Menu;

public class MainActivity extends Activity implements CallBack{

	FragmentManager fm;
    @SuppressLint("NewApi") @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fm=getFragmentManager();
		FragmentTransaction shiwu = fm.beginTransaction();
		shiwu.replace(R.id.fg2,new Fragment2());
		shiwu.commit();
    }

	@SuppressLint("NewApi") @Override
	public void getData(String data) {
		Fragment2 fg2=new Fragment2();
		Bundle bundle=new Bundle();
		bundle.putString("mes",data);
		fg2.setArguments(bundle);
		FragmentTransaction shiwu = fm.beginTransaction();
		shiwu.replace(R.id.fg2,fg2);
		shiwu.commit();
	}
    

}
</span>

第二個Fragment的邏輯程式碼檔案
<span style="font-size:18px;">package mars.day12_fragmenttofragment;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

@SuppressLint("NewApi") public class Fragment2 extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view=inflater.inflate(R.layout.fragment2,container,false);
		TextView tv=(TextView) view.findViewById(R.id.tv);
		Bundle bundle=getArguments();
		//判斷需寫
		if(bundle!=null)
		{
			tv.setText(bundle.getString("mes"));
		}
		return view;
	}
}
</span>

第二種和第三種方法:

Fragment對應的佈局檔案兩個都同上

主佈局檔案

<span style="font-size:18px;"><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="horizontal">
	<fragment 
	    android:id="@+id/fg1"
	    android:name="mars.day12_fragmenttofragment.Fragment1"
	    android:layout_height="match_parent"
	    android:layout_weight="1"
	    android:layout_width="0dp"/>
    <LinearLayout
        android:id="@+id/fg2"
        android:layout_height="match_parent"
        android:layout_weight="1" 
        android:layout_width="0dp"
        android:orientation="horizontal">
    </LinearLayout>

</LinearLayout>
</span>

第一個Fragment的邏輯程式碼檔案
<span style="font-size:18px;">package mars.method2and3;

import mars.day12_fragmenttofragment.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

@SuppressLint("NewApi") public class Fragment1 extends Fragment{
    EditText et;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment1,container,false);
        et=(EditText) view.findViewById(R.id.et);
        Button bt=(Button) view.findViewById(R.id.bt);
        bt.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                String data=et.getText().toString();
                //第二種方法
//                Fragment2 fg2=(Fragment2) getFragmentManager().findFragmentById(R.id.fg2);
//                fg2.setData(data);
                //第三種方法
                TextView tv=(TextView) getActivity().findViewById(R.id.tv);
                tv.setText(data);
            }
        });
        return view;
    }

}</span>

第2個Fragment的邏輯程式碼檔案

<span style="font-size:18px;">package mars.method2and3;

import mars.day12_fragmenttofragment.R;
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

@SuppressLint("NewApi") public class Fragment2 extends Fragment{

	TextView tv;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view=inflater.inflate(R.layout.fragment2,container,false);
		tv=(TextView) view.findViewById(R.id.tv);
		return view;
		
	}
	public void setData(String str)
	{
		tv.setText(str);
	}
}
</span>