Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android數據傳遞(三)之Activity傳遞到Fragment

android數據傳遞(三)之Activity傳遞到Fragment

編輯:關於Android編程

其實Activity和fragment之間傳遞數據有很多方法,我這裡說一個用的比較多的一個方法——接口回調,後面有運行效果

接口回調有幾個步驟:

1,要傳遞數據的類A裡面定義一個接口X,接口裡面創建一個構造方法,方法裡面的參數就是你要傳遞的數據類型

2,創建一個公共的方法Y,方法裡的參數就是你創建的接口X

3,在要接收的類B裡面拿到A類的實例對象a,調用A裡面創建的公共的方法Y,

@@1.如果B是實現的A裡面定義的那個接口,並實現了X裡面的抽象方法,那麼A的對象a調用A裡面的公共方法Y時參數裡面傳遞this就行了

@@2.如果B裡面不是實現A裡面的那個接口,那麼A的對象a調用A裡面的公共方法Y時裡面傳遞new A.Y,他會自動添加X裡面未實現的方法

說的有點暈,還是看代碼好一點

首先當然是創建一個項目,activity的布局文件裡面放一個frameLayout,用來讓Fragment替換,底部放置兩個Button用來點擊切換fagment,具體代碼如下:

 




    <framelayout android:id="@+id/main_frameLayout" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent">
    </framelayout>

    

然後在MainActivity定義一個接口,接口裡面定義一個方法,方法裡面的參數就是要傳遞數據的類型

 

 

public interface DataChange {
        void setDataChange(String qqq);
    }

 

 

創建一個公共的方法,參數是接口,當然你的先聲明這個接口的對象:
static DataChange dataChange;

 

public void setData(DataChange dataChange) {
        this.dataChange = dataChange;

    }

我這個例子是在MainActivity裡面請求數據,然後傳遞到Fragment裡面去,所以我用了一個第三方Jar包xUtils請求數據

 

具體請求數據的方法:

 

private void getData(String path) {
        HttpUtils utils = new HttpUtils();
        utils.send(HttpRequest.HttpMethod.GET, path, new RequestCallBack() {
            @Override
            public void onSuccess(ResponseInfo responseInfo) {
                //拿到請求到的數據
                String result = responseInfo.result;
                //調用接口的方法把數據傳遞進去
                if (dataChange!=null) {
                    dataChange.setDataChange(result);
                }
            }

            @Override
            public void onFailure(HttpException e, String s) {
                Toast.makeText(MainActivity.this, "請求數據失敗"+s, Toast.LENGTH_SHORT).show();
            }
        });
    }

創建兩個Fragment,點擊底部的Button讓不同的fragment去替換布局裡面的frameLayout

 

具體替換的方法是

 

    /**
     * 用來讓Fragment替換framelayout的方法
     *
     * @param fragment
     */
    private void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout, fragment).commit();

    }

點擊不同的Button替換fragment和調用getData()傳遞不同的網址請求不同的數據的方法:

 

 

public void button(View view) {

        switch (view.getId()) {
            case R.id.button1:
                changeFragment(fragmentA);
                getData("http://mobile.ximalaya.com/mobile/v1/album?albumId=2839012");
                break;
            case R.id.button2:
                changeFragment(fragmentB);
                getData("http://mobile.ximalaya.com/mobile/v1/album?albumId=2839015");
                break;

            default:
                break;
        }

在FragmentA和FragmentB裡面分別都放一個TextView用來顯示傳遞過去的數據

 

 



    


 

FragmentA裡面調用MainActivity裡面的方法:

 

 

   //拿到MainActivity的對象,調用它裡面的方法
        MainActivity activity = new MainActivity();
        activity.setData(new MainActivity.DataChange() {
            @Override
            public void setDataChange(String aaa) {
                textView.setText(aaa);
            }
        });

FragmentB裡面我用的是實現接口的方法:

 

 

public class FragmentB extends Fragment implements MainActivity.DataChange
然後實現接口裡面沒實現的方法:

 

 

/**
	 * 實現接口之後必須實現接口裡的抽象方法
	 * @param qqq
     */
	@Override
	public void setDataChange(String qqq) {
		textView.setText(qqq);
	}

然後調用MainActivity裡面的方法:

 

 

//實現接口的方式調用mainActivity的方法
		((MainActivity)getActivity()).setData(this);

大概就是這幾個步驟,就完成了數據的傳遞,下面我把所有的布局文件和Activity和Framgnet裡面的代碼貼出來:

 

MainActivity代碼如下:

 

package com.duanlian.interfacecallbackdemo1;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.duanlian.interfacecallbackdemo1.fragment.FragmentA;
import com.duanlian.interfacecallbackdemo1.fragment.FragmentB;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;

public class MainActivity extends FragmentActivity {
    String TAG = "duanlian-------";
    FragmentA fragmentA;
    FragmentB fragmentB;
    static DataChange dataChange;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragmentA = new FragmentA();
        fragmentB = new FragmentB();
    }

    public void setData(DataChange dataChange) {
        this.dataChange = dataChange;

    }

    /**
     * 創建一個接口
     */
    public interface DataChange {
        void setDataChange(String qqq);
    }

    public void button(View view) {

        switch (view.getId()) {
            case R.id.button1:
                changeFragment(fragmentA);
                getData("http://mobile.ximalaya.com/mobile/v1/album?albumId=2839012");
                break;
            case R.id.button2:
                changeFragment(fragmentB);
                getData("http://mobile.ximalaya.com/mobile/v1/album?albumId=2839015");
                break;

            default:
                break;
        }

    }
    private void getData(String path) {
        HttpUtils utils = new HttpUtils();
        utils.send(HttpRequest.HttpMethod.GET, path, new RequestCallBack() {
            @Override
            public void onSuccess(ResponseInfo responseInfo) {
                //拿到請求到的數據
                String result = responseInfo.result;
                //調用接口的方法把數據傳遞進去
                if (dataChange!=null) {
                    dataChange.setDataChange(result);
                }
            }

            @Override
            public void onFailure(HttpException e, String s) {
                Toast.makeText(MainActivity.this, "請求數據失敗"+s, Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 用來讓Fragment替換framelayout的方法
     *
     * @param fragment
     */
    private void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout, fragment).commit();

    }
}


MainActivity的布局文件:

 

 




    <framelayout android:id="@+id/main_frameLayout" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent">
    </framelayout>

    

FragmentA的代碼和布局文件:

 

 

package com.duanlian.interfacecallbackdemo1.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.duanlian.interfacecallbackdemo1.MainActivity;
import com.duanlian.interfacecallbackdemo1.R;


public class FragmentA extends Fragment {
    private TextView textView;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, null);
        textView = (TextView) view.findViewById(R.id.fragmemt_a_textview);
        //拿到MainActivity的對象,調用它裡面的方法
        MainActivity activity = new MainActivity();
        activity.setData(new MainActivity.DataChange() {
            @Override
            public void setDataChange(String aaa) {
                textView.setText(aaa);
            }
        });
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

}

布局文件:

 

 



    

FramemtB裡面的代碼:

 

 

package com.duanlian.interfacecallbackdemo1.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.duanlian.interfacecallbackdemo1.MainActivity;
import com.duanlian.interfacecallbackdemo1.R;


public class FragmentB extends Fragment implements MainActivity.DataChange{
	private TextView textView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
	View view = inflater.inflate(R.layout.fragment_b, null);
		 textView = (TextView) view.findViewById(R.id.fragmemt_b_textview);
		//實現接口的方式調用mainActivity的方法
		((MainActivity)getActivity()).setData(this);
		return view;
	}
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
	}

	/**
	 * 實現接口之後必須實現接口裡的抽象方法
	 * @param qqq
     */
	@Override
	public void setDataChange(String qqq) {
		textView.setText(qqq);
	}
}

布局文件:

 

 



    

運行結果如下:

 

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved