当前位置: 首页 > news >正文

文具网站建设规划书免费作图网站都有哪些

文具网站建设规划书,免费作图网站都有哪些,北京网站建设 shwl,外包业务APP页面实现根据原型图#xff0c;我们可以看出#xff0c;UI分为两部分#xff0c;底部Tab导航上方列表显示。 所以此处#xff0c;我们通过 FragmentTabHostFragment#xff0c;来实现底部的导航页面#xff0c;通过RecyclerView来实现列表页面。 因为篇幅原因#xf…APP页面实现根据原型图我们可以看出UI分为两部分底部Tab导航上方列表显示。 所以此处我们通过 FragmentTabHostFragment来实现底部的导航页面通过RecyclerView来实现列表页面。 因为篇幅原因关于FragmentTabHost和RecyclerView的使用不多做介绍可以建议参考: FragmentTabHost使用方法及RecycleView_PullToRefresh_LoadMore两篇文章其中后者关于Recyclerview的项目是我之前封装的一个支持下拉刷新加载更多添加Header和Footer等功能的RecyclerView便于使用。此处再多说一点因为是我们做自己来实现该ui没美工给我设计图切图标 所以我们需要自己去找图标此处推荐Iconfont-阿里巴巴矢量图标库, 在这里我们可以找到很多的图标选择适用的几个即可。篇幅原因具体的页面布局、实现代码我这里就不多贴有兴趣的可以直接看源码此处只贴出列表list_item的页面布局代码。 从原型图中我们可以看出列表的显示分为纯文显示和图片显示所以我们的item布局应该要兼容这两种显示方式。?xml version1.0 encodingutf-8? android.support.v7.widget.CardView xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:card_viewhttp://schemas.android.com/apk/res-autoandroid:idid/card_viewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginLeft4dpandroid:layout_marginRight4dpandroid:foreground?android:attr/selectableItemBackgroundcard_view:cardBackgroundColor#FFFFFFcard_view:cardCornerRadius8dpcard_view:cardElevation2dpcard_view:cardUseCompatPaddingtrueLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop6dpandroid:gravitycenter_verticalcom.lnyp.joke.widget.CircleImageViewandroid:idid/imgUserandroid:layout_width50dpandroid:layout_height50dpandroid:srcmipmap/ic_launcher /LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_centerVerticaltrueandroid:layout_marginLeft14dpandroid:layout_toRightOfid/imgUserandroid:orientationverticalTextViewandroid:idid/textUserNameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:singleLinetrueandroid:texttextUserNametextUserNametextUserNametextUserNametextUserNametextUserNametextUserNametextUserNametextUserNameandroid:textColor#333333android:textSize14sp /TextViewandroid:idid/textLastTimeandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginTop6dpandroid:layout_toRightOfid/imgUserandroid:gravityrightandroid:singleLinetrueandroid:texttextLastTimeandroid:textColor#555555android:textSize12sp //LinearLayout/RelativeLayoutTextViewandroid:idid/textContentandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginBottom4dpandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop4dpandroid:gravityleftandroid:lineSpacingExtra4dpandroid:text描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述描述android:textColor#333333android:textSize15spandroid:visibilitygone /com.lnyp.joke.widget.ShowMaxImageViewandroid:idid/imgJokeandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop10dpandroid:srcmipmap/ic_launcher /TextViewandroid:idid/textTitleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop4dpandroid:singleLinetrueandroid:texttitle title title tiltle titleandroid:textColor#333333android:textSize16sp /LinearLayoutandroid:idid/layoutTagsandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginBottom2dpandroid:layout_marginLeft10dpandroid:layout_marginRight10dpandroid:layout_marginTop4dpandroid:gravityrightandroid:orientationhorizontalTextViewandroid:idid/textTag1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom4dpandroid:layout_marginLeft4dpandroid:backgrounddrawable/house_tag_text_bgandroid:gravityleftandroid:paddingBottom2dpandroid:paddingLeft4dpandroid:paddingRight4dpandroid:paddingTop2dpandroid:singleLinetrueandroid:text标签android:textColor#333333android:textSize10sp /TextViewandroid:idid/textTag2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom4dpandroid:layout_marginLeft4dpandroid:backgrounddrawable/house_tag_text_bgandroid:gravityleftandroid:paddingBottom2dpandroid:paddingLeft4dpandroid:paddingRight4dpandroid:paddingTop2dpandroid:singleLinetrueandroid:text标签android:textColor#333333android:textSize10sp /TextViewandroid:idid/textTag3android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom4dpandroid:layout_marginLeft4dpandroid:backgrounddrawable/house_tag_text_bgandroid:gravityleftandroid:paddingBottom2dpandroid:paddingLeft4dpandroid:paddingRight4dpandroid:paddingTop2dpandroid:singleLinetrueandroid:text标签android:textColor#333333android:textSize10sp /TextViewandroid:idid/textTag4android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom4dpandroid:layout_marginLeft4dpandroid:backgrounddrawable/house_tag_text_bgandroid:gravityleftandroid:paddingBottom2dpandroid:paddingLeft4dpandroid:paddingRight4dpandroid:paddingTop2dpandroid:singleLinetrueandroid:text标签android:textColor#333333android:textSize10sp //LinearLayout/LinearLayout/android.support.v7.widget.CardView 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190效果图 我们只需要在实现的逻辑上控制文字、图片的显隐就好了。APP逻辑功能实现1.数据获取实现列表适配器在第一章捧腹网网页分析、数据获取中我已经讲过了如何去解析网页中的数据为我们所用拿到数据后我们需要用这些数据填充RecyclerView此处使用的是我已经封装好的RecyclerView支持翻页加载数据。import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView;import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.lnyp.joke.R; import com.lnyp.joke.pengfu.JokeBean; import com.lnyp.joke.widget.CircleImageView; import com.lnyp.joke.widget.ShowMaxImageView;import java.util.List;import butterknife.BindView; import butterknife.ButterKnife;/***笑话列表*/ public class JokeListAdapter extends RecyclerView.AdapterRecyclerView.ViewHolder {private LayoutInflater mInflater;private Fragment mContext;private ListJokeBean mDatas;private View.OnClickListener onItemClick;private int screenWidth;public JokeListAdapter(Fragment context, ListJokeBean datas, View.OnClickListener onItemClick) {this.mContext context;this.mDatas datas;this.onItemClick onItemClick;mInflater LayoutInflater.from(context.getActivity());DisplayMetrics metric new DisplayMetrics();context.getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);screenWidth metric.widthPixels;}Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view mInflater.inflate(R.layout.list_item_joke, parent, false);return new ViewHolder(view);}Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {ViewHolder viewHolder (ViewHolder) holder;JokeBean jokeBean mDatas.get(position);if (jokeBean ! null) {Glide.with(mContext).load(jokeBean.getUserAvatar()).asBitmap().centerCrop().into(viewHolder.imgUser);viewHolder.textUserName.setText(jokeBean.getUserName());viewHolder.textLastTime.setText(jokeBean.getLastTime());viewHolder.textTitle.setText(jokeBean.getTitle());JokeBean.DataBean dataBean jokeBean.getDataBean();if (dataBean ! null) {if (TextUtils.isEmpty(dataBean.getContent())) {viewHolder.textContent.setVisibility(View.GONE);viewHolder.imgJoke.setVisibility(View.VISIBLE);viewHolder.textTitle.setVisibility(View.VISIBLE);// System.out.println(dataBean.getShowImg() dataBean.getGifsrcImg());double width Double.parseDouble(dataBean.getWidth());double height Double.parseDouble(dataBean.getHeight());ViewGroup.LayoutParams lp viewHolder.imgJoke.getLayoutParams();lp.width (int) (screenWidth * 0.8);lp.height (int) (screenWidth * 0.8 * height / width);viewHolder.imgJoke.setLayoutParams(lp);String url dataBean.getShowImg();String gifUrl dataBean.getGifsrcImg();System.out.println(url : url gifUrl : gifUrl);if (TextUtils.isEmpty(gifUrl)) {Glide.with(mContext).load(url).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.imgJoke);} else {Glide.with(mContext).load(gifUrl).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.imgJoke);}} else {viewHolder.textContent.setVisibility(View.VISIBLE);viewHolder.imgJoke.setVisibility(View.GONE);viewHolder.textTitle.setVisibility(View.GONE);viewHolder.textContent.setText(dataBean.getContent());}}ListString tags jokeBean.getTags();if (tags ! null) {int size tags.size();if (size 0) {updateTags(viewHolder, View.GONE, View.GONE, View.GONE, View.GONE);} else if (size 1) {viewHolder.textTag1.setText(tags.get(0));updateTags(viewHolder, View.VISIBLE, View.GONE, View.GONE, View.GONE);} else if (size 2) {viewHolder.textTag1.setText(tags.get(0));viewHolder.textTag2.setText(tags.get(1));updateTags(viewHolder, View.VISIBLE, View.VISIBLE, View.GONE, View.GONE);} else if (size 3) {viewHolder.textTag1.setText(tags.get(0));viewHolder.textTag2.setText(tags.get(1));viewHolder.textTag3.setText(tags.get(2));updateTags(viewHolder, View.VISIBLE, View.VISIBLE, View.VISIBLE, View.GONE);} else {viewHolder.textTag1.setText(tags.get(0));viewHolder.textTag2.setText(tags.get(1));viewHolder.textTag3.setText(tags.get(2));viewHolder.textTag4.setText(tags.get(3));updateTags(viewHolder, View.VISIBLE, View.VISIBLE, View.VISIBLE, View.VISIBLE);}viewHolder.layoutTags.setVisibility(View.VISIBLE);} else {updateTags(viewHolder, View.GONE, View.GONE, View.GONE, View.GONE);viewHolder.layoutTags.setVisibility(View.GONE);}viewHolder.imgJoke.setTag(R.string.app_name, position);viewHolder.imgJoke.setOnClickListener(onItemClick);}}private void updateTags(ViewHolder viewHolder, int v1, int v2, int v3, int v4) {viewHolder.textTag1.setVisibility(v1);viewHolder.textTag2.setVisibility(v2);viewHolder.textTag3.setVisibility(v3);viewHolder.textTag4.setVisibility(v4);}Overridepublic int getItemCount() {return mDatas ! null ? mDatas.size() : 0;}class ViewHolder extends RecyclerView.ViewHolder {BindView(R.id.imgJoke)public ShowMaxImageView imgJoke;BindView(R.id.textContent)public TextView textContent;BindView(R.id.layoutTags)public LinearLayout layoutTags;BindView(R.id.textTitle)public TextView textTitle;BindView(R.id.textTag1)public TextView textTag1;BindView(R.id.textTag2)public TextView textTag2;BindView(R.id.textTag3)public TextView textTag3;BindView(R.id.textTag4)public TextView textTag4;BindView(R.id.imgUser)public CircleImageView imgUser;BindView(R.id.textUserName)public TextView textUserName;BindView(R.id.textLastTime)public TextView textLastTime;public ViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);}} }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207对于RecyclerView的适配器RecyclerView.Adapter的使用方式相信玩过它的人都很熟悉里面的方法不多介绍主要讲下图片处理这块的实现String url dataBean.getShowImg();String gifUrl dataBean.getGifsrcImg();System.out.println(url : url gifUrl : gifUrl);if (TextUtils.isEmpty(gifUrl)) {Glide.with(mContext).load(url).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.imgJoke);} else {Glide.with(mContext).load(gifUrl).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.imgJoke);}12345678app中要展示的图片分为静态图片和动态图片glide可以很好的处理gif动态图的加载但是如果像下面这样直接使用glide加载动态图效率可是比较慢的。Glide.with(mContext).load(gifUrl)into(viewHolder.imgJoke);1所以在加载gif动态图的时候我们通常使用下面这样的缓存策略Glide.with(mContext).load(gifUrl).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.imgJoke);1除了图片加载还有一点需要讲解下就是下面这段代码double width Double.parseDouble(dataBean.getWidth());double height Double.parseDouble(dataBean.getHeight());ViewGroup.LayoutParams lp viewHolder.imgJoke.getLayoutParams();lp.width (int) (screenWidth * 0.8);lp.height (int) (screenWidth * 0.8 * height / width);viewHolder.imgJoke.setLayoutParams(lp);123456这段代码的意思是在加载图片之前先设置了ImageView的宽高。这样做的目的是为了在图片加载显示之前就固定ImageView的大小避免了列表因为图片高度不一致而出现“晃动”。好到这里我们基本完成了列表显示功能了接下来在Fragment中实现功能逻辑。2.实现列表逻辑功能package com.lnyp.joke.fragment;import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import com.baoyz.widget.PullRefreshLayout; import com.lnyp.flexibledivider.HorizontalDividerItemDecoration; import com.lnyp.joke.R; import com.lnyp.joke.adapter.JokeListAdapter; import com.lnyp.joke.http.HttpUtils; import com.lnyp.joke.pengfu.JokeApi; import com.lnyp.joke.pengfu.JokeBean; import com.lnyp.joke.pengfu.JokeUtil; import com.lnyp.joke.widget.SmartisanDrawable; import com.lnyp.recyclerview.EndlessRecyclerOnScrollListener; import com.lnyp.recyclerview.HeaderAndFooterRecyclerViewAdapter; import com.lnyp.recyclerview.RecyclerViewLoadingFooter; import com.lnyp.recyclerview.RecyclerViewStateUtils; import com.victor.loading.rotate.RotateLoading;import org.jsoup.Jsoup; import org.jsoup.nodes.Document;import java.util.ArrayList; import java.util.List;import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder;public class MainFragment extends Fragment {private Unbinder unbinder;BindView(R.id.rotateloading)public RotateLoading rotateloading;BindView(R.id.swipeRefreshLayout)public PullRefreshLayout swipeRefreshLayout;BindView(R.id.listInspirations)public RecyclerView listInspirations;private HeaderAndFooterRecyclerViewAdapter mAdapter;private ListJokeBean mDatas;private int page 1;private boolean mHasMore false;private boolean isRefresh true;// 处理请求返回信息private MyHandler mHandler new MyHandler();private class MyHandler extends Handler {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 0:RecyclerViewStateUtils.setFooterViewState(listInspirations, RecyclerViewLoadingFooter.State.Normal);swipeRefreshLayout.setRefreshing(false);rotateloading.stop();mAdapter.notifyDataSetChanged();break;}}}public MainFragment() {}Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view inflater.inflate(R.layout.fragment_main, container, false);unbinder ButterKnife.bind(this, view);initView();rotateloading.start();refreshReq();return view;}private void initView() {mDatas new ArrayList();JokeListAdapter jokeListAdapter new JokeListAdapter(this, mDatas, onClickListener);mAdapter new HeaderAndFooterRecyclerViewAdapter(jokeListAdapter);listInspirations.setAdapter(mAdapter);listInspirations.setLayoutManager(new LinearLayoutManager(getActivity()));listInspirations.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).colorResId(R.color.divider_color).build());listInspirations.addOnScrollListener(mOnScrollListener);swipeRefreshLayout.setOnRefreshListener(onRefreshListener);swipeRefreshLayout.setRefreshDrawable(new SmartisanDrawable(getActivity(), swipeRefreshLayout));swipeRefreshLayout.setBackgroundColor(Color.parseColor(#EFEFEF));swipeRefreshLayout.setColor(Color.parseColor(#8F8F81));}private PullRefreshLayout.OnRefreshListener onRefreshListener new PullRefreshLayout.OnRefreshListener() {Overridepublic void onRefresh() {refreshReq();}};private void refreshReq() {isRefresh true;page 1;qryJokes();}private void qryJokes() {final String url JokeApi.PENGFU_NEW_JOKES page JokeApi.URL_SUFFIX;System.out.println(url);HttpUtils.doGetAsyn(url, new HttpUtils.CallBack() {Overridepublic void onRequestComplete(String result) {if (result null) {return;}System.out.println(result);Document doc Jsoup.parse(result);if (doc ! null) {JokeUtil jokeUtil new JokeUtil();ListJokeBean jokeBeens jokeUtil.getNewJokelist(doc);if (jokeBeens ! null) {page;mHasMore true;if (isRefresh) {mDatas.clear();isRefresh false;}mDatas.addAll(jokeBeens);mHandler.sendEmptyMessage(0);}}}});}private EndlessRecyclerOnScrollListener mOnScrollListener new EndlessRecyclerOnScrollListener() {Overridepublic void onLoadNextPage(View view) {super.onLoadNextPage(view);RecyclerViewLoadingFooter.State state RecyclerViewStateUtils.getFooterViewState(listInspirations);if (state RecyclerViewLoadingFooter.State.Loading) {return;}if (mHasMore) {RecyclerViewStateUtils.setFooterViewState(getActivity(), listInspirations, mHasMore, RecyclerViewLoadingFooter.State.Loading, null);qryJokes();} else {RecyclerViewStateUtils.setFooterViewState(getActivity(), listInspirations, mHasMore, RecyclerViewLoadingFooter.State.TheEnd, null);}}};private View.OnClickListener onClickListener new View.OnClickListener() {Overridepublic void onClick(View view) {try {int pos (int) view.getTag(R.string.app_name);JokeBean jokeBean mDatas.get(pos);String showImg jokeBean.getDataBean().getShowImg();String gifSrcImg jokeBean.getDataBean().getGifsrcImg(); //System.out.println(showImg gifSrcImg);} catch (Exception e) {e.printStackTrace();}}};Overridepublic void onDestroyView() {super.onDestroyView();unbinder.unbind();} } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228功能逻辑比较简单不多做解释。 到这里我们的“捧腹”APP已经完成了80%了。下面在做些扩展性的功能使得它更像一个完整的APP。3. 图片的大图浏览功能上篇博文我们就提到了我们要使用PhotoView实现大图的浏览功能。 PhotoView的使用可以直接在它的github官方介绍上看到下面我直接贴出使用代码。 import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.view.View; import android.widget.ImageView;import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy;import butterknife.BindView; import butterknife.ButterKnife; import uk.co.senab.photoview.PhotoViewAttacher;/*** 图片浏览*/ public class PhotoActivity extends FragmentActivity {BindView(R.id.imgJoke)public ImageView imgJoke;private String showImg;private String gifSrcImg;private PhotoViewAttacher mAttacher;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_photo);ButterKnife.bind(this);mAttacher new PhotoViewAttacher(imgJoke);showImg getIntent().getStringExtra(showImg);gifSrcImg getIntent().getStringExtra(gifSrcImg);System.out.println(showImg gifSrcImg);if (TextUtils.isEmpty(gifSrcImg)) {Glide.with(this).load(showImg).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imgJoke);} else {Glide.with(this).load(gifSrcImg).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imgJoke);}mAttacher.update();mAttacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {Overridepublic void onPhotoTap(View view, float x, float y) {PhotoActivity.this.finish();}Overridepublic void onOutsidePhotoTap() {PhotoActivity.this.finish();}});} } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162程序中我们添加了一个事件监听主要是为了在用户单击图片显示或者不显示部分时可以退出浏览。4.为APP加入Bughd 实现崩溃分析、版本更新功能功能做到这里基本上完成了90%的APP接下来我们为其加入崩溃分析、版本更新功能。 关于如何配置大家直接到http://bughd.com/doc/android官网看看官方文档为app添加功能是开发的基本能力而且这个功能集成并不困难建议大家自己添加有疑问可参考我最后放出的源码。APP打包发布截止此处我们的“捧腹”APP基本上就已经实现了在说打包发布之前我要提到一个很重要的问题那就是数据版权。 我们知道这个app的数据是分析“捧腹网”的网页拿到的我们应当尊重其版权所有。 因为我们是学习使用所以大家应在app明显的位置加上数据来源。这里我选择在启动页面上添加。 接下来就是打包发布了。关于如何打包app限于篇幅请参考我之前写的 Android Studio(十二)打包多个发布渠道的apk文件 ,打包apk成功后我们将其发布在fir.im免费托管分发服务的平台上方便大家下载测试。如果没问题可以上传到应用市场。 最后让我们看下APP最终效果。 项目小结 如果你能耐下心来看完这三篇实战博文相信你也可以做一个简单的app了。这个app实现并不难博文讲解的也算是详尽很容易理解。 这系列的博文主要是针对初中级开发者帮大家在研发过程中理清思路一步步完成一个完整的app。希望看完这篇博文的朋友也能够举一反三 做出一个自己所属的app。源码地址https://github.com/zuiwuyuan/Joke apk下载地址 http://fir.im/xiaohane欢迎有问题的朋友留言讨论也欢迎进QQ群来讨论交流487786925 Android研发村 谢谢大家的支持。版权声明本文为博主原创文章未经博主允许不得转载。 http://blog.csdn.net/zuiwuyuan/article/details/52554939
http://www.pierceye.com/news/139968/

相关文章:

  • 企业网页制作与网站设计网站必须天天更新吗
  • 乌苏市城乡建设局网站外贸网网站建设
  • html5网站开发实例书籍凡科建站代理
  • 与建设部网站网站注册登录页面设计
  • 企业网站推广计划免费最新如何建设网站教程视频
  • 17一起做网站普宁站好看个人网页模板
  • 民治营销网站专业网站建设价格最优
  • 免费的html网站做柜子喜欢上哪些网站看
  • 网站没备案怎么做加速现代装修风格三室两厅效果图
  • 互助平台网站建设网上商城怎么购物
  • 百度知道山东网站建设建设网站成本预算
  • 人人做免费网站网站建站是 什么
  • 以背景做网站视频为单位网站建设实施方案
  • 简洁大气企业网站模板西安个人做网站
  • 做一个网站需要到哪里做辽宁同鑫建设网站
  • 开发网站监控推荐扬中市建设局网站
  • 手机网站根目录简述一个网站设计的主要步骤
  • 网站改版seo建议网页设计师的能力
  • 网站上线前应该备案吗温州网站建设风格
  • 网站建设书籍免费聊城市东昌府区建设路小学网站
  • 网站标题优化怎么做找人一起做素材网站
  • 如何创建个人网站模板用织梦做模板网站
  • 平台建站建设做网站一定要有营业执照吗
  • 如何把学校网站建设好天猫店铺购买
  • 网站的建设和推广企业网站建设的主要目的是
  • html5 公众号 网站开发工程公司名称
  • 公司做网站那家好网站二维码怎么制作
  • 鼓楼区建设房产和交通局网站网站全屏图片怎么做
  • 外贸订单流失严重番禺网站建设优化推广
  • 做网站送邮箱电商网站建设行情