搜索----Android Demo
在前面的博客中,小编简单的介绍了,点击发现按钮,自动加载热门的相关数据,成长的脚步从不停歇,完成了发现的功能,今天我们来简单看一下如何在搜索栏中输入关键字,搜索出我们所需要的信息,今天这篇博文小编就简单的介绍一下,如何输入关键字,搜索出相应内容的故事。希望可以帮助到需要的小伙伴,还请小伙伴们多多指教。
首先,我们需要编写实体里面的代码,这个功能小编用到了两个实体,首先我们来看第一个实体content如下所示:
package com.jczb.car.bean; import java.util.Date; import java.util.List; import android.R.integer; import android.R.integer; /** * 说明:段子内容实体 * 作者:丁国华 * 时间:2015-8-27下午2:32:57 */ @SuppressWarnings("serial") public class Content extends Entity { /** 内容表标识 */ private int uid; /** 显示标题 */ private String title; /** 视频或者图片路径 */ private String path; /**详情*/ private String details; /**频道类型*/ private String channelType; /**频道名称*/ private String channelName; /**作者*/ private String author; /**是否推荐*/ private String isRecommend; /**阅读或者播放数量*/ private int browseNumber; /**评论数*/ private int commentbrowseNumber; /**赞数*/ private int praiseNumber; /**踩数*/ private int treadNumber; /**发布时间*/ private String issueTime; /**是否收藏*/ private int isCollect; /**关联视频*/ private List<VideoRelation> Content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getDetails() { return details; } public void setDetails(String details) { this.details = details; } public String getChannelType() { return channelType; } public void setChannelType(String channelType) { this.channelType = channelType; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getIsRecommend() { return isRecommend; } public void setIsRecommend(String isRecommend) { this.isRecommend = isRecommend; } public int getBrowseNumber() { return browseNumber; } public void setBrowseNumber(int browseNumber) { this.browseNumber = browseNumber; } public int getCommentbrowseNumber() { return commentbrowseNumber; } public void setCommentbrowseNumber(int commentbrowseNumber) { this.commentbrowseNumber = commentbrowseNumber; } public int getPraiseNumber() { return praiseNumber; } public void setPraiseNumber(int praiseNumber) { this.praiseNumber = praiseNumber; } public int getTreadNumber() { return treadNumber; } public void setTreadNumber(int treadNumber) { this.treadNumber = treadNumber; } public String getIssueTime() { return issueTime; } public void setIssueTime(String issueTime) { this.issueTime = issueTime; } public String getChannelName() { return channelName; } public void setChannelName(String channelName) { this.channelName = channelName; } public int getIsCollect() { return isCollect; } public void setIsCollect(int isCollect) { this.isCollect = isCollect; } public List<VideoRelation> getContent() { return Content; } public void setContent(List<VideoRelation> content) { Content = content; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } }
第二个实体contentVo,具体代码如下所示:
package com.jczb.car.bean; import java.util.List; /** * 说明:内容集合,用于Json串的解析 * 作者:丁国华 * 时间:2015-8-26下午9:45:26 */ @SuppressWarnings("serial") public class ContentVo extends Entity { public final static String CATALOG_ALL = "all"; public final static String CATALOG_NEWS = "news"; public final static String CATALOG_POST = "post"; public final static String CATALOG_SOFTWARE = "software"; public final static String CATALOG_CODE = "code"; /** 服务器返回结果:true或false */ private String result; /** 服务器返回的Json串解析为List结合 */ private List<Content> Content; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public List<Content> getContent() { return Content; } public void setContent(List<Content> content) { Content = content; } }
接着,来编写我们的需要调用的接口方法,代码如下所示:
/** * 说明:搜索内容 * * @param params * 当前页码(pagenow)和当前页新闻数量(count)参数的集合 * @param isRefresh * 是否刷新 * @param contentVoId * 本地缓存id的组成部分 * @return * @user 丁国华 * @date 2015年9月11日 15:56:49 */ public ContentVo getSearchContentVoCategoryContent(Map<String, Object> params, boolean isRefresh, int contentVoId) throws AppException { ContentVo contentVo = null; // 构建缓存文件的key String key = "searchCategoryContentVo_" + contentVoId; // 1.如果联网则首先从服务器获取数据 if (isNetworkConnected() &&(!isReadDataCache(key) || isRefresh)) { try { // 从服务器获取contentVo的集合 contentVo = ApiClient.getSearchContent(this, params); // 如果能够获取到服务器中的数据则保存到本地缓存,只有保证数据不为空,且获取到的结果为true的时候才缓存到本地 if (contentVo != null && contentVo.getResult().equals("false")) { contentVo.setCacheKey(key); saveObject(contentVo, key); } } catch (AppException e) { // 如果出现访问中途断网,则获取本地缓存中的数据 contentVo = (ContentVo) readObject(key); // 如果本地缓存中数据为空,则抛出异常 if (contentVo == null) { throw e; } } } // 2.如果未联网则从缓存中获取数据 else { contentVo = (ContentVo) readObject(key); if (contentVo == null) { contentVo = new ContentVo(); } return contentVo; } return contentVo; }
第三步,我们来编写我们的xml布局,需要注意的是,我们搜索出来的信息是一个listview,所以在这里我们需要布局两个xml,第一个xml,search_content.xml具体代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@color/white"> <FrameLayout android:layout_width="fill_parent" android:layout_height="30dip" android:gravity="center_vertical" android:paddingLeft="5dip" android:paddingRight="5dip" android:orientation="horizontal" android:background="@drawable/widget_head_bg"> <EditText android:id="@+id/search_content_key" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="left|center" android:layout_marginRight="36dip" android:singleLine="true" android:focusable="true" android:focusableInTouchMode="true" android:imeOptions="actionSearch" android:background="@drawable/edit_search_bg" android:hint="输入搜索内容"/> <Button android:id="@+id/search_content_btn" android:layout_width="wrap_content" android:layout_height="30dip" android:layout_gravity="right|center" android:background="@drawable/btn_search_bg"/> <ProgressBar android:id="@+id/search_content_progress" style="@style/loading_small" android:layout_gravity="right|center" android:layout_marginRight="8dip" android:background="@color/white" android:visibility="gone"/> </FrameLayout> <LinearLayout android:id="@+id/search_ll" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/search_content_listview" style="@style/widget_listview"/> </LinearLayout> </LinearLayout>
第二个search_result.xml代码如下所示:
<?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" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp"> <TextView android:id="@+id/search_result_news_title" style="@style/list_notify_view" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="4dp" android:layout_weight="10" android:background="@null" android:ellipsize="end" android:singleLine="true" android:textSize="16sp"/> <!-- 收藏按钮 --> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginRight="5dp" android:layout_weight="0.5" android:gravity="center" > <ImageView android:id="@+id/search_result_news_collecstar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.5" android:src="@drawable/my_collect_usercenter" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical|center" android:text="@string/home_news_love" android:textColor="@color/home_news_text_color" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/search_result_picture_id" android:layout_width="match_parent" android:layout_height="150dp" android:layout_margin="5dp" android:scaleType="centerCrop" android:src="@drawable/cheduanzi_tuwen" /> <!-- 视频底部有关信息 --> <LinearLayout android:layout_width="match_parent" android:layout_height="26dp" android:layout_marginTop="2dp" > <!-- 视频所属频道 --> <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_marginLeft="4dp" android:layout_weight="1" > <TextView android:id="@+id/search_result_news_category" style="@style/list_notify_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/home_categorybg" android:gravity="center_vertical|center" /> </LinearLayout> <!-- 视频播放次数 --> <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="0dp" android:src="@drawable/news_playicon" /> <TextView android:id="@+id/search_result_news_playIcon" style="@style/list_notify_view" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="2dp" android:background="@null" android:gravity="center_vertical" /> </LinearLayout> <!-- 视频相关评论 --> <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.4" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="0dp" android:src="@drawable/news_comment" /> <TextView android:id="@+id/search_result_news_comment" style="@style/list_notify_view" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="2dp" android:background="@null" android:gravity="center_vertical" /> </LinearLayout> <!-- 转载视频 --> <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.3" android:gravity="center_vertical|center" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="0dp" android:src="@drawable/share_cheduanzi" /> </LinearLayout> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="5.0dip" android:layout_marginTop="2dp" android:background="@color/home_news_divider_color" /> </LinearLayout>
第四步,采用适配器adapter绑定数据,具体代码如下所示:
package com.jczb.car.adapter; import java.util.List; /** * 搜索资源Adapter类 * @author 丁国华 * @version 1.0 * @created 2015年9月9日 15:14:26 */ import com.jczb.car.R; import com.jczb.car.bean.Content; import com.jczb.car.bean.ContentVo; import com.jczb.car.bean.SearchContent; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class ListViewSearchAdapter extends BaseAdapter { private Context context; //运行上下文 private List<Content> listItems;//数据集合 private LayoutInflater listContainer; //视图容器 private int itemViewResource;//自定义项视图源 static class ListItemView{ //自定义控件集合 public TextView title; public ImageView isCollect; public TextView channelName; public TextView browseNumber; public TextView commentCount; } /** * 实例化Adapter * @param context * @param data * @param resource */ public ListViewSearchAdapter(Context context, List<Content> data,int resource) { this.context = context; this.listContainer = LayoutInflater.from(context); //创建视图容器并设置上下文 this.itemViewResource = resource; this.listItems = data; } @Override public int getCount() { // TODO Auto-generated method stub return listItems.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //Log.d("method", "getView"); //自定义视图 ListItemView listItemView = null; if (convertView == null) { //获取list_item布局文件的视图 convertView = listContainer.inflate(this.itemViewResource, null); listItemView = new ListItemView(); //获取控件对象 listItemView.title=(TextView)convertView.findViewById(R.id.search_result_news_title); listItemView.isCollect=(ImageView)convertView.findViewById(R.id.search_result_news_collecstar); listItemView.channelName=(TextView)convertView.findViewById(R.id.search_result_news_category); listItemView.browseNumber=(TextView)convertView.findViewById(R.id.search_result_news_playIcon); listItemView.commentCount=(TextView)convertView.findViewById(R.id.search_result_news_comment); //设置控件集到convertView convertView.setTag(listItemView); }else { listItemView = (ListItemView)convertView.getTag(); } //设置文字和图片 Content searchContent= listItems.get(position); listItemView.title.setText(searchContent.getTitle()); listItemView.channelName.setText(searchContent.getChannelName()); listItemView.browseNumber.setText(searchContent.getBrowseNumber()+""); listItemView.commentCount.setText(searchContent.getCommentbrowseNumber()+""); return convertView; } }
第五步,编写java类里面的代码,如下所示:
package com.jczb.car.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jczb.car.AppContext; import com.jczb.car.AppException; import com.jczb.car.R; import com.jczb.car.adapter.ListViewNewsAdapter; import com.jczb.car.adapter.ListViewSearchAdapter; import com.jczb.car.bean.Content; import com.jczb.car.bean.ContentVo; import com.jczb.car.bean.Notice; import com.jczb.car.bean.SearchContent; import com.jczb.car.common.StringUtils; import com.jczb.car.common.UIHelper; import android.R.string; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class SearchContentActivity extends BaseActivity { /** 搜索按钮 */ private Button btSearchPicture; /** 搜索的输入框 */ private EditText etSearchFrame; /** 进度条 */ private ProgressBar mProgressbar; private ListView lvSearch; private View lvSearch_footer; private ListViewSearchAdapter lvSearchAdapter; private List<Content> lvSearchData = new ArrayList<Content>(); private TextView lvSearch_foot_more; private ProgressBar lvSearch_foot_progress; private Handler mSearchHandler; private int lvSumData; private String curSearchCatalog = ContentVo.CATALOG_SOFTWARE; private int curLvDataState; private String curSearchContent = ""; private InputMethodManager imm; private final static int DATA_LOAD_ING = 0x001; private final static int DATA_LOAD_COMPLETE = 0x002; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_content); this.initView(); this.initData(); } /** * 头部按钮展示 * * @param type */ private void headButtonSwitch(int type) { switch (type) { case DATA_LOAD_ING: btSearchPicture.setClickable(false); mProgressbar.setVisibility(View.VISIBLE); break; case DATA_LOAD_COMPLETE: btSearchPicture.setClickable(true); mProgressbar.setVisibility(View.GONE); break; } } // 初始化视图控件 private void initView() { imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); btSearchPicture = (Button) findViewById(R.id.search_content_btn); etSearchFrame = (EditText) findViewById(R.id.search_content_key); mProgressbar = (ProgressBar) findViewById(R.id.search_content_progress); btSearchPicture.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { etSearchFrame.clearFocus(); curSearchContent = etSearchFrame.getText().toString(); loadLvSearchData(curSearchCatalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_INIT); Toast.makeText(SearchContentActivity.this, "shou", 1); } }); etSearchFrame .setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { imm.showSoftInput(v, 0); } else { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } }); etSearchFrame.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) { if (v.getTag() == null) { v.setTag(1); etSearchFrame.clearFocus(); curSearchContent = etSearchFrame.getText().toString(); loadLvSearchData(curSearchCatalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_INIT); } else { v.setTag(null); } return true; } return false; } }); lvSearch_footer = getLayoutInflater().inflate(R.layout.listview_footer, null); lvSearch_foot_more = (TextView) lvSearch_footer .findViewById(R.id.listview_foot_more); lvSearch_foot_progress = (ProgressBar) lvSearch_footer .findViewById(R.id.listview_foot_progress); lvSearchAdapter = new ListViewSearchAdapter(this, lvSearchData, R.layout.search_result_item); lvSearch = (ListView) findViewById(R.id.search_content_listview); lvSearch.setVisibility(ListView.GONE); lvSearch.addFooterView(lvSearch_footer);// 添加底部视图 必须在setAdapter前 lvSearch.setAdapter(lvSearchAdapter); lvSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击底部栏无效 if (view == lvSearch_footer) return; SearchContent res = null; // 判断是否是TextView if (view instanceof TextView) { res = (SearchContent) view.getTag(); } else { TextView title = (TextView) view .findViewById(R.id.search_result_news_title); res = (SearchContent) title.getTag(); } if (res == null) return; } }); } private void initData() { // TODO Auto-generated method stub mSearchHandler = new Handler() { public void handleMessage(Message msg) { headButtonSwitch(DATA_LOAD_COMPLETE); if (msg.what >= 0) { ContentVo list = (ContentVo) msg.obj; Notice notice = list.getNotice(); // 处理listview数据 switch (msg.arg1) { case UIHelper.LISTVIEW_ACTION_INIT: case UIHelper.LISTVIEW_ACTION_REFRESH: case UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG: lvSumData = msg.what; lvSearchData.clear();// 先清除原有数据 lvSearchData.addAll(list.getContent()); break; case UIHelper.LISTVIEW_ACTION_SCROLL: lvSumData += msg.what; if (lvSearchData.size() > 0) { for (Content res1 : list.getContent()) { boolean b = false; for (Content res2 : lvSearchData) { if (res1.getId() == res2.getId()) { b = true; break; } } if (!b) lvSearchData.add(res1); } } else { lvSearchData.addAll(list.getContent()); } lvSearchData.addAll(list.getContent()); break; } if (msg.what < 20) { curLvDataState = UIHelper.LISTVIEW_DATA_FULL; lvSearchAdapter.notifyDataSetChanged(); lvSearch_foot_more.setText(R.string.load_full); } else if (msg.what == 20) { curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvSearchAdapter.notifyDataSetChanged(); lvSearch_foot_more.setText(R.string.load_more); } // 发送通知广播 if (notice != null) { // UIHelper.sendBroadCast(SearchContentActivity.this, // notice); } } else if (msg.what == -1) { // 有异常--显示加载出错 & 弹出错误消息 curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvSearch_foot_more.setText(R.string.load_error); ((AppException) msg.obj) .makeToast(SearchContentActivity.this); } if (lvSearchData.size() == 0) { curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY; lvSearch_foot_more.setText(R.string.load_empty); } lvSearch_foot_progress.setVisibility(View.GONE); if (msg.arg1 != UIHelper.LISTVIEW_ACTION_SCROLL) { lvSearch.setSelection(0);// 返回头部 } } }; } /** * 线程加载收藏数据 * * @param type * 0:全部收藏 1:软件 2:话题 3:博客 4:新闻 5:代码 * @param pageIndex * 当前页数 * @param handler * 处理器 * @param action * 动作标识 */ private void loadLvSearchData(final String catalog, final int pageIndex, final Handler handler, final int action) { if (StringUtils.isEmpty(curSearchContent)) { UIHelper.ToastMessage(SearchContentActivity.this, "请输入搜索内容"); return; } headButtonSwitch(DATA_LOAD_ING); lvSearch.setVisibility(ListView.VISIBLE); new Thread() { public void run() { Message msg = new Message(); Map<String, Object> searchContentMap = new HashMap<String, Object>(); searchContentMap.put("keyword", curSearchContent); searchContentMap.put("pagenow", "1"); searchContentMap.put("userId", "1"); try { // 获取全局对象Application AppContext appContext = (AppContext) getApplication(); /* 发现 */ ContentVo searchList = appContext.getSearchContentVoCategoryContent(searchContentMap, true, 4); msg.what = 5; msg.obj = searchList; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } msg.arg1 = action;// 告知handler当前action if (curSearchCatalog.equals(catalog)) handler.sendMessage(msg); } }.start(); } private View.OnClickListener searchBtnClick(final Button btn, final String catalog) { return new View.OnClickListener() { public void onClick(View v) { btSearchPicture.setEnabled(true); // 开始搜索 etSearchFrame.clearFocus(); curSearchContent = etSearchFrame.getText().toString(); curSearchCatalog = catalog; loadLvSearchData(catalog, 0, mSearchHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG); } }; } }
最后,我们来看一下运行的效果,如下图所示:
小编寄语:搜索的实现功能,小编就简单的介绍到这里,搜索实现了,但是小编到现在还是云里雾里,不过没关系,小编会越挫越勇的,这就是生命的意义,还是那句话对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下最珍贵的记忆,虽然以后小编不一定从事安卓这个行业,代码世界里,很多种事,有的甜蜜,有的温馨,有的婉转成歌,有的绵延不息,在这些故事里,我们唯一的共通之处就是,某年,某月,某个波澜不惊的日子里,曾经很爱很爱你!爱你--这段实习的日子里,安卓带给小编的种种的惊喜。在 下篇博文中小编将和小伙伴们一起来分享如何通过手机获取验证码实现注册的小功能,敬请期待`(*∩_∩*)′!
搜索----Android Demo的更多相关文章
- LeadTools Android 入门教学——运行第一个Android Demo
LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- Ubuntu TensorFlow 源码 Android Demo的编译运行
Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...
- YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。
实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...
- vs2017 android demo
vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...
- BNR Android Demo学习笔记(一)——CrimeIntent
开发环境:win7,Android Studio 1.2, 1.Model Crime,数据模型,每个Crime有一个UUID作为唯一标识. package tina.criminalintent; ...
- 【Android Demo】加载.gif格式图片
Android系统为了节省内存,一般不支持直接显示gif图片,即使你强制设置了,也只会显示图片的第一帧. 这个 Demo 是在网上看到的,是个思路,还是有些局限性,还是记录下,以后研究吧. 1.效果图 ...
- 【Android Demo】悬浮窗体实现
突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager ...
随机推荐
- 洛谷mNOIP模拟赛Day1-斐波那契
题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...
- 2015 多校联赛 ——HDU5384(AC自动机)
Sample Input 1 5 6 orz sto kirigiri danganronpa ooooo o kyouko dangan ronpa ooooo ooooo Sample Out ...
- poj 3335 Rotating Scoreboard(半平面交)
Rotating Scoreboard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6420 Accepted: 25 ...
- 初遇 Asp.net MVC 数据库依赖缓存那些事儿
问题背景: 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法: 我请求的这段数据它是一段相对比较固定的 ...
- TeamViewer 服务队列网页怎么打开?有什么用?
熟悉一款软件,除了要熟悉它的界面,还应该熟悉它的网站.可能会有很多人说,网站我当然知道了.但是TeamViewer的服务队列页面你真的熟悉吗?所以,今天小编就带大家深入的了解一下TeamViewer服 ...
- 记录一次widora sdk编译ipk 实战编译redis
因为业务需求,需要用到redis存储一点简单的数据,因为redis有良好的哈希机制,可以完美实现我的某些需求,但openwrt官方提供memcached的ipk并没有提供redis,没办法,只能自 ...
- Android SDK下载安装及配置教程
2017年12月07日 13:33:32 4942 转载自:http://blog.csdn.net/dr_neo/article/details/49870587 Android开发环境搭建可以分为 ...
- phpstorm查看类的继承关系
在看一些框架源码时,有些类有很多的继承或者接口,有一款神奇的帮助很重要 选中一个类文件,右键,选择diagrams->show diagrams 即可得到类的继承关系,如上右图 使用函数 fun ...
- redis在java客户端的操作
redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择.(和memcache相似)redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装r ...
- python学习之路前端-HTML
HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...