編輯:關於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>
public interface DataChange { void setDataChange(String qqq); }
創建一個公共的方法,參數是接口,當然你的先聲明這個接口的對象:
static DataChange dataChange;
public void setData(DataChange dataChange) { this.dataChange = dataChange; }
具體請求數據的方法:
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(); }
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裡面調用MainActivity裡面的方法:
//拿到MainActivity的對象,調用它裡面的方法 MainActivity activity = new MainActivity(); activity.setData(new MainActivity.DataChange() { @Override public void setDataChange(String aaa) { textView.setText(aaa); } });
public class FragmentB extends Fragment implements MainActivity.DataChange然後實現接口裡面沒實現的方法:
/** * 實現接口之後必須實現接口裡的抽象方法 * @param qqq */ @Override public void setDataChange(String qqq) { textView.setText(qqq); }
//實現接口的方式調用mainActivity的方法 ((MainActivity)getActivity()).setData(this);
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(); } }
<framelayout android:id="@+id/main_frameLayout" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent"> </framelayout>
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); } }
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); } }
現在很多app都用到了頭像的功能,我的項目中也用到了。頭像上傳分幾步:1.獲取頭像2.剪裁頭像3.文件上傳4.服務器的接受保存首先第一步,無非就是兩種方式1,拍照2,相冊
整理總結自鴻洋的博客:http://blog.csdn.net/lmj623565791/article/details/38352503/ 一、FlowLay
多年以前Android的網絡請求只有Apache開源的HttpClient和JDK的HttpUrlConnection,近幾年隨著OkHttp的流行Android在高版本
本文本著開源的精神介紹如何向一個Android系統中添加一個產品的整個過程,按照以下過程筆者有理由相信每個將要從事本行業的人都可以完成,其實添加一個產品並不難,難的是對其