android 资讯阅读器
最近找申请到了一个不错的接口 , 非常适合拿来写一个资讯类的app.
现在着手写,随写随更.也算是抛砖引玉.烂尾请勿喷.╭(╯^╰)╮
android 资讯阅读器
第一阶段目标样式(滑动切换标签 , 侧滑菜单):
图1 图2
首先我使用的ide 是android studio 2.0 已经集成了侧滑菜单的module
新建的时候选一下就好了.过程就不细说了.这个很简单.
下面就是实现滑动切换tab的效果啦.其实我这个写的并不是很好看,网上还有很多开源的滑动切寒tab的案例
盆友们可以自己去集成下.下面说下我的tab的实现效果(参考自:http://www.imooc.com/learn/264 大神鸿洋的慕课)
实现方法是viewpage+Fragment (单单用fragment并没有实现滑动效果).
如果你跟我一样用的是 图2 的模板 那么就要在content_main.xml下做如下修改
content_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.zfls.didainf.MainActivity"
tools:showIn="@layout/app_bar_main"
android:orientation="vertical"> <include layout="@layout/topbar"/> <android.support.v4.view.ViewPager
android:id="@+id/id_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</android.support.v4.view.ViewPager> </LinearLayout>
使用的viewpage千万不要引入错咯.
topbar.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="wrap_content"
android:background="?attr/colorPrimary"
android:orientation="horizontal"> <LinearLayout
android:id="@+id/topical"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/topical_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="热点"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> <LinearLayout
android:id="@+id/entertainment"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/entertainment_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="娱乐"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> <LinearLayout
android:id="@+id/lettres"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/lettres_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="美文"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> <LinearLayout
android:id="@+id/funny"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/funny_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="搞笑"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> <LinearLayout
android:id="@+id/jokes"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/jokes_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="段子"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> <LinearLayout
android:id="@+id/games"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"> <TextView
android:id="@+id/games_text_bg"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="游戏"
android:textColor="#fff"
android:textSize="15dp" />
</LinearLayout> </LinearLayout>
很好理解, topbar 就是做一个顶部的布局,然后放到整体的布局中去.
效果如下(还不错 O(∩_∩)O哈!):
放进整体布局后就如 图1 的样子.
下面再创建一个布局文件用来做每个模块的容器
tab_topcial.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"> <android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefreshlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/tab_topical_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
这里说明下:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefreshlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> ... </android.support.v4.widget.SwipeRefreshLayout>
SwipeRefreshLayout 是谷歌提供的下拉刷新模块.用它包裹listview 可以实现下拉刷新的效果(具体用法可以自行百度一下,或者等我再发一篇博客 嘿嘿)
下面是java代码了.
MainActivity.java :
package com.zfls.didainf; import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener,View.OnClickListener { private ViewPager mViewPager;
private FragmentPagerAdapter mAdapter;
private List<Fragment> mFragments; //tab
private LinearLayout topical;
private LinearLayout entertainment;
private LinearLayout lettres;
private LinearLayout funny;
private LinearLayout jokes;
private LinearLayout games; private TextView topical_t;
private TextView entertainment_t;
private TextView lettres_t;
private TextView funny_t;
private TextView jokes_t;
private TextView games_t; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initside(); initView(); initWork(); setSelect(0);
}
//统一监听
private void initWork() { topical.setOnClickListener(this);
entertainment.setOnClickListener(this);
lettres.setOnClickListener(this);
funny.setOnClickListener(this);
jokes.setOnClickListener(this);
games.setOnClickListener(this); }
//声明相关控件
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.id_viewpager); topical = (LinearLayout) findViewById(R.id.topical);
entertainment = (LinearLayout) findViewById(R.id.entertainment);
lettres = (LinearLayout) findViewById(R.id.lettres);
funny = (LinearLayout) findViewById(R.id.funny);
jokes = (LinearLayout) findViewById(R.id.jokes);
games = (LinearLayout) findViewById(R.id.games); topical_t = (TextView) findViewById(R.id.topical_text_bg);
entertainment_t = (TextView) findViewById(R.id.entertainment_text_bg);
lettres_t = (TextView) findViewById(R.id.lettres_text_bg);
funny_t = (TextView) findViewById(R.id.funny_text_bg);
jokes_t = (TextView) findViewById(R.id.jokes_text_bg);
games_t = (TextView) findViewById(R.id.games_text_bg); mFragments = new ArrayList<Fragment>();
Fragment mTab01 = new TopicalFragment();
Fragment mTab02 = new EntertainmentFragment();
Fragment mTab03 = new LetteresFragment();
Fragment mTab04 = new FunnyFragment();
Fragment mTab05 = new JokesFragment();
Fragment mTab06 = new GamesFragment();
mFragments.add(mTab01);
mFragments.add(mTab02);
mFragments.add(mTab03);
mFragments.add(mTab04);
mFragments.add(mTab05);
mFragments.add(mTab06); mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override
public android.support.v4.app.Fragment getItem(int position) {
return mFragments.get(position);
} @Override
public int getCount() {
return mFragments.size();
}
};
mViewPager.setAdapter(mAdapter); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override
public void onPageSelected(int position) {
int currentItem = mViewPager.getCurrentItem();
setTab(currentItem);
} @Override
public void onPageScrollStateChanged(int state) { }
}); } //侧滑
private void initside() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
} @Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} @SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId(); if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.topical:
//热点
setSelect(0);
break;
case R.id.entertainment:
//娱乐
setSelect(1);
break;
case R.id.lettres:
//美文
setSelect(2);
break;
case R.id.funny:
//搞笑
setSelect(3);
break;
case R.id.jokes:
//段子
setSelect(4);
break;
case R.id.games:
//游戏
setSelect(5);
break; default:
break;
}
} private void setSelect(int i) {
setTab(i);
mViewPager.setCurrentItem(i);
} //修改被选中的tab 文字的背景颜色(R.color.color.colorAccent 在 res/value/colors.xml 下)
private void setTab(int i) { changbg();
switch (i){
case 0:
topical_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
case 1:
entertainment_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
case 2:
lettres_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
case 3:
funny_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
case 4:
jokes_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
case 5:
games_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorAccent));
break;
}
}
//将所有文字背景色改成未选中状态
private void changbg()
{
topical_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
entertainment_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
lettres_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
funny_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
jokes_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
games_t.setTextColor(ContextCompat.getColor(MainActivity.this , R.color.colorWrite));
}
}
看起来挺多挺吓人,其实还好不算太多.
附件里面有鸿洋大神的demo,可以拿来移植一下.嘿嘿嘿
百度云链接 : http://pan.baidu.com/s/1boHCUbt
提取码:nhn2
移植完了以后就可以在手机上看下效果了.
android 资讯阅读器的更多相关文章
- android 资讯阅读器(二)
接着上次的博客,上次移植完了tab以后整个app的框架就算是定下来了. 本次目标: 1.数据的获取与展示(ListView) 2.官方的下拉刷新效果(SwipeRefreshLayout) 3.数据接 ...
- android rss阅读器开发一点小技巧
这几天一直在学习开发Rss阅读器,遇到一个很坑的问题,InputSource这里总是出错.弄了好久,终于让我找到一个解决方法----看代码: new Thread(){ @Override publi ...
- Android NurReaderView 阅读器 (字符串-.txt文件)
有些地方还没配置好.2/3天后在更新.... 功能 支持字符串和<.txt>文件 文字自动分各个页面 支持从右到左-(从右边开始的语言.比如维吾尔语哈扎克语...外国的阿拉伯语等) 支持自 ...
- android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码
Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...
- 电子书及阅读器Demo
电子书阅读器(Kindle,电子纸技术.LCD.电子墨水技术等: 亚马逊/当当网站) 电子书产业可分5大环节:内容供应商.数字格式制作商.内容流通服务平台.传输平台以及终端阅读器产品. 全球电子书市 ...
- Android IT资讯网络阅读器应用源码
这个是Android IT资讯网络阅读器应用,也是一款通过jsoup解析Html获取内容的网络阅读器,和前面的其实是类似的,也是大学时期闲暇完成,对照CSDN的Web页面元素设计进行解析提取内容,核心 ...
- Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码
我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...
- 将批量下载的博客导入到手机后,通过豆约翰博客阅读器APP(Android手机)进行浏览,白字黑底,保护眼睛,图文并茂。
首先下面演示的博文来自于以下地址:http://www.douban.com/note/423939291/ 需要先通过博客备份专家将导出的博文导入到手机(还不会用的朋友请先阅读http://www. ...
- (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇
从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...
随机推荐
- mysql连接报错 Host ‘xxx’is blocked because of many connection errors;unblock with 'mysqladmin flush-hosts'
程序无法连接MySQL,提示: null, message from server: "Host '192.168.6.68' is blocked because of many con ...
- css font-weight原理
为什么要记录一下?因为今天我要设置一个字符加粗,然后就用font-weight:200,没有任何效果.现在看来很可笑,400才相当于normal,200怎么加粗,奇怪的是也没有变细.所以得研究一下fo ...
- 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)
9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...
- 第一天接触Orchard
第一天接触Orchard 为什么要研究Orchard 呢? 楼主是因为要研究下最新的ASP.NET技术, Orchard 用的人多,历史也比较久,算是老牌了 再就是中文资料比较多,Orchard 有中 ...
- 安装VS2013,可是电脑C盘没空间了,今天早上整理了下
安装VS2013,可是电脑C盘没空间了,今天早上整理了下 安装VS2013,要求C盘有11G的空闲空间,不然不让装, 咋天下好了安装文件,6.89G 今天早上一来, 首先把 一些软件删掉,装到了D盘, ...
- AndroidStudio 混淆打包
AndroidStudio中的项目可以用compile的形式引入github上的开 源项目,可以引用module,而不一定都要用libs文件夹中添加jar包的形式.在最终realease打包时,混淆的 ...
- 实现了与maya场交互的能力
今天把模拟节点与maya场的对接做好了,效果如图: 图中黄色线为每个节点受到的外力,由于加了一个重力场,所以外力都是竖直向下. 节点连线方式如图所示: 交互的具体方法是在每次模拟之前,更新每个节点所受 ...
- ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现
from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...
- 微软职位内部推荐-B&I Site Lead
微软近期Open的职位: Job Title: B&I Site Lead Division: Phones Quality, SWIQ Location: Beijing, China Mi ...
- Windows Phone App Studio 无码开发手机应用
上周微软发布了一款基于Web的Windows Phone应用开发工具 "Windows Phone App Studio".它与大家熟知Visual Studio的最大不同之处是W ...