友盟整合第三方登入 + 登入註冊 + 跑馬燈 + Zxing二維碼
如圖:
第一步:建立工程
整合友盟第三方,建立工程時,包名:com.umeng.soexample
第二步:添加回調Activity
主要是qq和微信的回撥
第三步:匯入jar和res
將main資料夾以及platform(選擇你想使用的平臺即可)檔案下,對應的資原始檔和jar放入你的工程!
配置Android Manifest XML
<!-- 許可權 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 微信 --> <activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <!-- QQ --> <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent100424468" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Android6.0許可權適配
請檢視你的build.gradle
檔案,如果 targetSdkVersion
小於或等於22,可以忽略這一步,如果大於或等於23,需要做許可權的動態申請:
if(Build.VERSION.SDK_INT>=23){
String[] mPermissionList = new String[{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_LOGS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.SET_DEBUG_APP,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.GET_ACCOUNTS,
Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this,mPermissionList,123);
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
}
初始化設定
自己建立一個類,整合AppLication
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this,"5a12384aa40fa3551f0001d1"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0
}
在onCreate方法中設定所需要的各個平臺的appkey值
PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0");
//豆瓣RENREN平臺目前只能在伺服器端配置
PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com");
PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf");
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO");
PlatformConfig.setAlipay("2015111700822536");
PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e");
PlatformConfig.setPinterest("1439206");
PlatformConfig.setKakao("e4f60e065048eb031e235c806b31c70f");
PlatformConfig.setDing("dingoalmlnohc0wggfedpk");
PlatformConfig.setVKontakte("5764965","5My6SNliAaLxEm3Lyd9J");
PlatformConfig.setDropbox("oz8v5apet3arcdy","h7p2pjbzkkxt02a");
PlatformConfig.setYnote("9c82bf470cba7bd2f1819b0ee26f86c6ce670e9b");
開始第三方登入
在Activity中寫程式碼;
獲取使用者資料
獲取使用者資料可以使用如下介面:
在需要的位置的點選事件中寫
其中umAuthListener為授權回撥,構建如下:
//QQ授權
private void initListenr() {
authListener = new UMAuthListener() {
/**
* @desc 授權開始的回撥
* @param platform 平臺名稱
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授權成功的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
Toast.makeText(LoginActivity.this, platform + "登入成功了!!!", Toast.LENGTH_LONG).show();
}
/**
* @desc 授權失敗的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(LoginActivity.this, "失敗:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授權取消的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
}
授權問題
第一次授權登入成功後,再次進行登入,回預設授權成功
如果需要每次登入都提示登入頁面,需要在activity中新增一下程式碼:
UMShareConfig config = new UMShareConfig();
config.isNeedAuthOnGetUserInfo(true);
UMShareAPI.get(InfoDetailActivity.this).setShareConfig(config);
目前SDK預設設定為在Token有效期內登入不進行二次授權,如果有需要每次登入都彈出授權頁面,便於切換賬號的開發者可以新增上述程式碼
好了,不多說了,開始上程式碼了
LoginActivity
public class LoginActivity extends AppCompatActivity implements View.OnClickListener, LoginView {
/**
* 登入
*/
private Button mBtnLogin;
/**
* 註冊
*/
private Button mBtnReg;
/**
* 第三方QQ登入
*/
private Button mBtnQq;
/**
* 請輸入手機號......
*/
private EditText mEdLoginMobile;
/**
* 請輸入密碼......
*/
private EditText mEdLoginPassword;
private LoginPresenter mLoginPresenter;
private String mMobile;
private String mPassword;
private Button mBtnWx;
UMAuthListener authListener;
/**
* 記住密碼
*/
private CheckBox mCheckJz;
/**
* 自動登入
*/
private CheckBox mCheckLogin;
private SharedPreferences mSP;
private SharedPreferences.Editor mEdit;
private Intent mIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//初始化控制元件
initView();
mLoginPresenter = new LoginPresenter(this);
//6.0版本以上的動態許可權
initPermission();
//QQ授權
initListenr();
//建立SharedPreferences儲存資料
mSP = getSharedPreferences("config", MODE_PRIVATE);
boolean isCheck = mSP.getBoolean("isCheck", false);//是否記住密碼
boolean isLogin = mSP.getBoolean("isLogin", false);//是否自動登入
mEdit = mSP.edit();
//判斷是否記住密碼
if (isCheck) {
mEdLoginMobile.setText(mSP.getString("mobile", mMobile));
mEdLoginPassword.setText(mSP.getString("password", mPassword));
mCheckJz.setChecked(true);
//判斷自動登入多選狀態
if (isLogin) {
mCheckLogin.setChecked(true);
//跳轉
mIntent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(mIntent);
}
}
//複選框內容改變方法
initChecked();
}
//複選框內容改變方法
private void initChecked() {
mCheckLogin.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//判斷是否自動登入
if (mCheckLogin.isChecked()) {
mCheckJz.setChecked(true);
mEdit.putBoolean("isLogin", true).commit();
} else {
mEdit.putBoolean("isLogin", false).commit();
}
}
});
}
//QQ授權
private void initListenr() {
authListener = new UMAuthListener() {
/**
* @desc 授權開始的回撥
* @param platform 平臺名稱
*/
@Override
public void onStart(SHARE_MEDIA platform) {
}
/**
* @desc 授權成功的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param data 使用者資料返回
*/
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
mIntent = new Intent(LoginActivity.this, MainActivity.class);
mIntent.putExtra("name", data.get("name"));
mIntent.putExtra("pri", data.get("profile_image_url"));
startActivity(mIntent);
finish();
Toast.makeText(LoginActivity.this, platform + "登入成功了!!!", Toast.LENGTH_LONG).show();
}
/**
* @desc 授權失敗的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
* @param t 錯誤原因
*/
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(LoginActivity.this, "失敗:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
/**
* @desc 授權取消的回撥
* @param platform 平臺名稱
* @param action 行為序號,開發者用不上
*/
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
}
};
}
//初始化控制元件
private void initView() {
mBtnLogin = (Button) findViewById(R.id.btn_login);
mBtnLogin.setOnClickListener(this);
mBtnReg = (Button) findViewById(R.id.btn_reg);
mBtnReg.setOnClickListener(this);
mBtnQq = (Button) findViewById(R.id.btn_qq);
mBtnQq.setOnClickListener(this);
mEdLoginMobile = (EditText) findViewById(R.id.ed_login_mobile);
mEdLoginPassword = (EditText) findViewById(R.id.ed_login_password);
mBtnWx = (Button) findViewById(R.id.btn_wx);
mBtnWx.setOnClickListener(this);
mCheckJz = (CheckBox) findViewById(R.id.check_jz);
mCheckJz.setOnClickListener(this);
mCheckLogin = (CheckBox) findViewById(R.id.check_login);
mCheckLogin.setOnClickListener(this);
}
//點選事件
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.btn_login://登入
mMobile = mEdLoginMobile.getText().toString().trim();
mPassword = mEdLoginPassword.getText().toString().trim();
mLoginPresenter.login(mMobile, mPassword);
break;
case R.id.btn_reg://註冊
startActivity(new Intent(this, RegActivity.class));
finish();
break;
case R.id.btn_qq://QQ登入
initPermission();
UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener);
break;
case R.id.btn_wx://微信登入
initPermission();
UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.WEIXIN, authListener);
break;
}
}
/**
* mvp介面回撥 訪問資料成功
*
* @param result
*/
@Override
public void onLoginSuccess(String result) {
if (mCheckJz.isChecked()) {//記住密碼
mEdit.putBoolean("isCheck", true);
mEdit.putString("mobile", mMobile);
mEdit.putString("password", mPassword);
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
mIntent = new Intent(this, MainActivity.class);
mIntent.putExtra("mobile", mMobile);
startActivity(mIntent);
finish();
mEdit.commit();
} else {//清除記住密碼
mEdit.clear();
mEdit.commit();
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
mIntent = new Intent(this, MainActivity.class);
mIntent.putExtra("mobile", mMobile);
startActivity(mIntent);
finish();
}
/**
* mvp介面回撥 訪問資料失敗
*
* @param error
*/
@Override
public void onLoginFailed(String error) {
if (error.equals("天呢!使用者不存在")) {
Toast.makeText(this, "使用者不存在,請去註冊頁面註冊!!!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}
}
/**
* QQ授權
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
/**
* 防止記憶體洩露
*/
@Override
protected void onDestroy() {
super.onDestroy();
mLoginPresenter.datechView();
}
//動態許可權
private void initPermission() {
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this, mPermissionList, 123);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
}
}
LoginAndRegCallBack
public interface LoginAndRegCallBack {
void onSuccess(String result);
void onFailed(String error);
}
view層
public interface LoginView {
void onLoginSuccess(String result);
void onLoginFailed(String error);
}
model層
public class LoginModel {
public void login(String mobile, String password, final LoginAndRegCallBack callBack) {
String loginPath = "http://www.zhaoapi.cn/user/login?mobile="+mobile+"&password=" + password;
new HttpUtil().get(loginPath).result(new HttpUtil.HttpListener() {
@Override
public void success(String data) {
Gson gson = new Gson();
LoginAndRegBean bean = gson.fromJson(data, LoginAndRegBean.class);
if (bean.getCode().equals("0")) {
callBack.onSuccess(bean.getMsg());
}else {
callBack.onFailed(bean.getMsg());
}
}
@Override
public void fail() {
}
});
}
}
presenter層
public class LoginPresenter {
private LoginView mLoginView;
private LoginModel mLoginModel;
public LoginPresenter(LoginView loginView) {
mLoginView = loginView;
mLoginModel = new LoginModel();
}
//解綁
public void datechView(){
mLoginView = null;
}
public void login(String mobile,String password){
mLoginModel.login(mobile, password, new LoginAndRegCallBack() {
@Override
public void onSuccess(String result) {
mLoginView.onLoginSuccess(result);
}
@Override
public void onFailed(String error) {
mLoginView.onLoginFailed(error);
}
});
}
}
Utils聯網工具類
public class HttpUtil {
private final int HTTP_SUCCESS=1000;//成功
private final int HTTP_FAIL=1001;//失敗
public HttpUtil(){}
//get請求
public HttpUtil get(String url){
doHttp(url,"GET",null);
return this;
}
//post
public HttpUtil post(String url, String string){
doHttp(url,"POST",string);
return this;
}
//網路請求
private void doHttp(final String url,final String method,final String string){
new Thread(){
@Override
public void run() {
super.run();
try {
URL u=new URL(url);
HttpURLConnection connection= (HttpURLConnection) u.openConnection();
connection.setRequestMethod(method);
connection.setConnectTimeout(5000);
if("POST".equals(method)){
//post請求新增引數
PrintWriter writer=new PrintWriter(connection.getOutputStream());
writer.write(string);
writer.flush();
writer.close();
}
connection.connect();
int code=connection.getResponseCode();
Message message=Message.obtain();
if(code==HttpURLConnection.HTTP_OK){
message.what=HTTP_SUCCESS;
InputStream is = connection.getInputStream();
String data=convertStream2String(is);
message.obj=data;
}else{
message.what=HTTP_FAIL;
}
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case HTTP_SUCCESS://成功
String data= (String) msg.obj;
listener.success(data);
break;
case HTTP_FAIL://失敗
listener.fail();
break;
}
}
};
private HttpListener listener;
public void result(HttpListener listener){
this.listener=listener;
}
public interface HttpListener{
void success(String data);
void fail();
}
public String convertStream2String(InputStream input){
ByteArrayOutputStream baos = new ByteArrayOutputStream();// 自帶快取的輸出流
int len=-1;
byte [] buffer = new byte[512];
try {
while((len = input.read(buffer))!=-1){
baos.write(buffer, 0, len); // 將讀到的位元組,寫入baos
}
return new String(baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
註冊入上登入程式碼一樣
PullToRefresh+banner展示
Bean類
public class NewsBean {
private ResultBean result;
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public class ResultBean{
private int total;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
private List<DataList> data;
public List<DataList> getData() {
return data;
}
public void setData(List<DataList> data) {
this.data = data;
}
public class DataList{
private String title;
private String intor;
private String summary;
private String ctime;
private String media_name;
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getCtime() {
return ctime;
}
public void setCtime(String ctime) {
this.ctime = ctime;
}
public String getMedia_name() {
return media_name;
}
public void setMedia_name(String media_name) {
this.media_name = media_name;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
private List<ImageBean> images;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIntor() {
return intor;
}
public void setIntor(String intor) {
this.intor = intor;
}
public List<ImageBean> getImages() {
return images;
}
public void setImages(List<ImageBean> images) {
this.images = images;
}
public class ImageBean{
private String u;
public String getU() {
return u;
}
public void setU(String u) {
this.u = u;
}
}
}
}
}
//資料展示+banner
public class ShowFragment extends Fragment {
private View mView;
private BGABanner mBgaBanner;
private PullToRefreshListView mPullList;
private String[] titleUrl = {
"http://www.zhaoapi.cn/images/quarter/ad1.png",
"http://www.zhaoapi.cn/images/quarter/ad2.png",
"http://www.zhaoapi.cn/images/quarter/ad3.png",
"http://www.zhaoapi.cn/images/quarter/ad4.png"
};
private String[] descUrl = {
"第十三界瑞麗模特大賽", "文化藝術節", "直播封面標準", "人氣誰最高,金主誰最豪氣"
};
private List<String> mTitle;
private List<String> mDesc;
private NewsPresenter mNewsPresenter;
private MyNewsAdapter mMyNewsAdapter;
private List<NewsBean.ResultBean.DataList> mDataBeans = new ArrayList<>();
private List<NewsBean.ResultBean.DataList> mLists = new ArrayList<>();
private int pager = 1;
private int total;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_show, container, false);
//初始化控制元件
initView(mView);
return mView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//初始化BGABanner資料
initBGABannerData();
initNewsData(pager);
}
private void initBGABannerData() {
mTitle = new ArrayList<>();
mDesc = new ArrayList<>();
//迴圈新增到集合
for (int i = 0; i < titleUrl.length; i++) {
mTitle.add(titleUrl[i]);//把數組裡的值駕到集合裡去
mDesc.add(descUrl[i]);
}
//設定值 裡面要新增集合
mBgaBanner.setData(mTitle, mDesc);
//設定一個BGbanner的介面卡 要給他加泛型 一個圖片空間一個字元型別
mBgaBanner.setAdapter(new BGABanner.Adapter<ImageView, String>() {
@Override
public void fillBannerItem(BGABanner banner, ImageView itemView, @Nullable String model, int position) {
//使用Picasso載入圖片
Picasso.with(getActivity()).load(mTitle.get(position)).fit().into(itemView);
}
});
}
private void initView(View mView) {
mBgaBanner = (BGABanner) mView.findViewById(R.id.bga_banner);
mPullList = (PullToRefreshListView) mView.findViewById(R.id.pull_list);
mPullList.setMode(PullToRefreshBase.Mode.BOTH);
mMyNewsAdapter = new MyNewsAdapter(getActivity());
mPullList.setAdapter(mMyNewsAdapter);
mMyNewsAdapter.setList(mLists);
mPullList.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
mLists.clear();
initNewsData(1);
mMyNewsAdapter.notifyDataSetChanged();
mPullList.postDelayed(new Runnable() {
@Override
public void run() {
mPullList.onRefreshComplete();
}
},2000);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
if (mLists.size() > total){
Toast.makeText(getActivity(), "沒有更多資料了", Toast.LENGTH_SHORT).show();
}else {
pager++;
initNewsData(pager);
mMyNewsAdapter.notifyDataSetChanged();
mPullList.postDelayed(new Runnable() {
@Override
public void run() {
mPullList.onRefreshComplete();
}
},2000);
}
}
});
mPullList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
NewsItemActivity.startWebActivity(getActivity(),mLists.get(i).getUrl());
}
});
}
private void initNewsData(int page) {
String newsPath = "http://feed.mix.sina.com.cn/api/roll/get?pageid=153&lid=2509&k=&num=20&page="+page;
new HttpUtil().get(newsPath).result(new HttpUtil.HttpListener() {
@Override
public void success(String data) {
Gson gson = new Gson();
NewsBean newsBean = gson.fromJson(data, NewsBean.class);
total = newsBean.getResult().getTotal();
List<NewsBean.ResultBean.DataList> lists = newsBean.getResult().getData();
mLists.addAll(lists);
mMyNewsAdapter.setList(mLists);
mMyNewsAdapter.notifyDataSetChanged();
mPullList.onRefreshComplete();//關閉
}
@Override
public void fail() {
}
});
}
}
介面卡
public class MyNewsAdapter extends BaseAdapter {
private Context mContext;
private List<NewsBean.ResultBean.DataList> mDataBeans = new ArrayList<>();
public MyNewsAdapter(Context context) {
mContext = context;
}
public void setList(List<NewsBean.ResultBean.DataList> dataBeans) {
this.mDataBeans = dataBeans;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mDataBeans.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
MyViewHolder holder;
if (view == null) {
view = View.inflate(mContext, R.layout.news_item_view, null);
holder = new MyViewHolder();
holder.mCircleImageView = view.findViewById(R.id.c_imgicon);
holder.mTextViewTitle = view.findViewById(R.id.txt_news_title);
holder.mTextViewIntor = view.findViewById(R.id.txt_news_intro);
holder.mTextViewName = view.findViewById(R.id.txt_news_name);
view.setTag(holder);
} else {
holder = (MyViewHolder) view.getTag();
}
//Picasso.with(mContext).load(mDataBeans.get(i).getImages().get(i).getU()).fit().into(holder.mCircleImageView);
//圖片非空判斷,必須新增,不然會報 陣列下標越界異常
if (mDataBeans.get(i).getImages() != null && mDataBeans.get(i).getImages().size() > 0) {
ImageLoader.getInstance().displayImage(mDataBeans.get(i).getImages().get(0).getU(), holder.mCircleImageView);
} else {
holder.mCircleImageView.setImageResource(R.drawable.p);
}
holder.mTextViewTitle.setText(mDataBeans.get(i).getTitle());
holder.mTextViewIntor.setText(mDataBeans.get(i).getIntor());
holder.mTextViewName.setText(mDataBeans.get(i).getMedia_name());
return view;
}
class MyViewHolder {
CircleImageView mCircleImageView;
TextView mTextViewTitle, mTextViewIntor, mTextViewName;
}
}
使用Zxing生成二維碼
public class QRCodeFragment extends Fragment implements View.OnClickListener {
private View mView;
private View view;
private ImageView mQrImgicon;
private ImageView mQrImgicons;
/**
* 退出登入
*/
private Button mBtnQuit;
private String mName;
private String mPri;
private CircleImageView mCQrImgicon;
private TextView mTxtQrTexts;
private SharedPreferences mSP;
private SharedPreferences.Editor mEdit;
private String mMobile;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_qr, container, false);
initView(mView);
return mView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//取出QQ暱稱的值
mName = getActivity().getIntent().getStringExtra("name");
mPri = getActivity().getIntent().getStringExtra("pri");
mMobile = getActivity().getIntent().getStringExtra("mobile");
ImageLoader.getInstance().displayImage(mPri, mCQrImgicon);
//判斷是QQ暱稱還是手機號
if (mName == null) {
mTxtQrTexts.setText(mMobile);
}else {
mTxtQrTexts.setText(mName);
}
//初始化 自動生成二維碼
initZxingData();
mSP = getActivity().getSharedPreferences("config", Context.MODE_PRIVATE);
mEdit = mSP.edit();
}
private void initZxingData() {
//判斷是QQ暱稱還是手機號,然後生成二維碼
if (mName == null) {
QRTask qrTask = new QRTask(getActivity(), mQrImgicons, mMobile);
qrTask.execute(mMobile);
}else {
QRTask qrTask = new QRTask(getActivity(), mQrImgicons, mName);
qrTask.execute(mName);
}
}
//建立 QRTask 類,實現自動生成二維碼
class QRTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<Context> mContextWeakReference;
private final WeakReference<ImageView> mImageViewWeakReference;
String mString;
//第一步,先建立構造方法
public QRTask(Context context, ImageView imageView, String string) {
//new 出例項
mContextWeakReference = new WeakReference<>(context);
mImageViewWeakReference = new WeakReference<>(imageView);
}
@Override
protected Bitmap doInBackground(String... strings) {
String string = strings[0];
if (TextUtils.isEmpty(string)) {
return null;
}
int size = 200;
return QRCodeEncoder.syncEncodeQRCode(string, size);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (bitmap != null) {
mImageViewWeakReference.get().setImageBitmap(bitmap);
} else {
Toast.makeText(mContextWeakReference.get(), "二維碼生成失敗", Toast.LENGTH_SHORT).show();
}
}
}
private void initView(View mView) {
mQrImgicon = (ImageView) mView.findViewById(R.id.qr_imgicon);
mQrImgicons = (ImageView) mView.findViewById(R.id.qr_imgicons);
mBtnQuit = (Button) mView.findViewById(R.id.btn_quit);
mBtnQuit.setOnClickListener(this);
mQrImgicon.setOnClickListener(this);
mCQrImgicon = (CircleImageView) mView.findViewById(R.id.c_qr_imgicon);
mTxtQrTexts = (TextView) mView.findViewById(R.id.txt_qr_texts);
mCQrImgicon.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.btn_quit:
mEdit.clear();//清空所記住的內容
mEdit.commit();//關閉
startActivity(new Intent(getActivity(), LoginActivity.class));
getActivity().finish();
break;
case R.id.qr_imgicon:
startActivity(new Intent(getActivity(), ScanActivity.class));
getActivity().finish();
break;
case R.id.c_qr_imgicon:
Toast.makeText(getActivity(), mPri, Toast.LENGTH_SHORT).show();
break;
}
}
}
自定義TextView實現跑馬燈
@SuppressLint("AppCompatCustomView")
public class MyTextView extends TextView {
public MyTextView(Context context) {
this(context,null);
}
public MyTextView(Context context, AttributeSet attrs) {
this(context, attrs,-1);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
}
//佈局
<com.umeng.soexample.customer.MyTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#77ef1717"
android:ellipsize="marquee"
android:focusable="true"
android:layout_margin="5dp"
android:focusableInTouchMode="true"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="內容自定義"
android:textColor="#ffffff"
android:textSize="24sp" />