首页 > 其他分享 >Android模仿网易新闻

Android模仿网易新闻

时间:2022-12-21 13:32:20浏览次数:73  
标签:网易 layout getString id jObject1 import Android android 模仿


需要生成本地的API:请参考博客:
​Python3实现 将MySQL数据库中的记录生成JSON数据​​Python生成本地API

动态图:

​https://recordit.co/k1QTy10Khi​​ 运行截图:

Android模仿网易新闻_xml


Android模仿网易新闻_android_02


代码实现:

首先实现清单文件:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iyuba.mytablayout">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ContentActivity"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

acitivity_main.xml
启动页面布局
使用TabLayout,其设置Tab的模式是"可滑动的" ,app:tabMode=“scrollable”
app:tabMode="fixed"是不可滑动的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="#ADBE107E"
app:tabMode="scrollable"/>

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</LinearLayout>

运行截图如下:

Android模仿网易新闻_android_03


MainActivity.java

说明:AppBarLayout是Android Design Support Library新加的控件,继承自LinearLayout,它用来将Toolbar和TabLayout组合起来作为一个整体。Toolbar是应用内容的标准工具栏,可以说是Actionbar的升级版

package com.iyuba.mytablayout;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private DrawerLayout mDrawerLayout;
private ViewPager mViewPager; //在上面添加新闻标题和新闻图片
private TabLayout mTabLayout; //新闻分类标签布局
private static String PARTICAL_URLS = "http://192.168.3.243/getNews/?Category="; //API前缀
private static String PARTICAL_URLS_LIMIT = "&limit="; //API后缀
private static int PARTICAL_URLS_Num = 100; //请求数据库记录的数量

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Toolbar即能取代原本的 actionbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
initViewPager();
}

/**
* 初始化控件
*/
private void initViewPager() {
mViewPager = findViewById(R.id.viewpager);
mTabLayout = (TabLayout) findViewById(R.id.tabs);
List<String> titles = new ArrayList<>();
titles.add("F1方程赛车");
titles.add("骑行");
titles.add("残疾运行");
titles.add("田径");
titles.add("橄榄球联盟");
titles.add("网球");
//将标题添加到Tab标签中
for (int i = 0; i < titles.size(); i++) {
mTabLayout.addTab(mTabLayout.newTab().setText(titles.get(i)));
}
/**
* 添加新闻Item内容
*/
List<Fragment> fragments = new ArrayList<>();
String url = "";

url = PARTICAL_URLS + "formula1" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
fragments.add(new ListFragment(url));
url = PARTICAL_URLS + "cycling" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
fragments.add(new ListFragment(url));
//分别为每个分类设置相应的内容
for (int i = 2; i < titles.size(); i++) {
//获得相应标题
String title = titles.get(i).toString().trim();
//根据题目设置相应的api
if (title.equals("残疾运行")) {
url = PARTICAL_URLS + "disability-sport" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
} else if (title.equals("田径")) {
url = PARTICAL_URLS + "athletics" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
} else if (title.equals("橄榄球联盟")) {
url = PARTICAL_URLS + "rugby-union" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
} else if (title.equals("网球")) {
url = PARTICAL_URLS + "tennis" + PARTICAL_URLS_LIMIT + PARTICAL_URLS_Num;
}

fragments.add(new ListFragment(url));
}

FragmentAdapter mFragmentAdapteradapter =
new FragmentAdapter(getSupportFragmentManager(), fragments, titles);
//给ViewPager设置适配器
mViewPager.setAdapter(mFragmentAdapteradapter);
//将TabLayout和ViewPager关联起来。
mTabLayout.setupWithViewPager(mViewPager);
//给TabLayout设置适配器
mTabLayout.setTabsFromPagerAdapter(mFragmentAdapteradapter);

}
}

FragmentList.java
设置的Fragment作为每个Tab的界面

package com.iyuba.mytablayout;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.iyuba.mytablayout.model.News;
import com.iyuba.mytablayout.model.NewsTitle;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


@SuppressLint("ValidFragment")
public class ListFragment extends Fragment {
private ArrayList<News> mList = new ArrayList<>();
private ArrayList<NewsTitle> titlesList = new ArrayList<>();
private RecyclerView mRecyclerView;

/**
* 传入url,获取json数据
*
* @param url
*/
public ListFragment(final String url) {
Log.d("getSomething", url);
new Thread(new Runnable() {
@Override
public void run() {

try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
String requestData = response.body().string();
parseJSONWithJSONObject(requestData);
for (int i = 0; i < titlesList.size(); i++) {
String imgurl;
if (i % 2 == 0) {
imgurl = "https://timgsa.baidu.com/timg?
image&quality=80&size=b9999_10000&sec=1565707361598&di=
72fa1d8fc2749f29ba6d159f2ef11f14&imgtype=0&src=http%3A%2F%
2F5b0988e595225.cdn.sohucs.com%2Fq_70%2Cc_zoom%2Cw_640%2
Fimages%2F20180928%2Fa670b1f4df9741e5a6bfbe6246fb95ba.jpeg";
} else {
imgurl = "http://b-ssl.duitang.com/uploads/blog/201403/20
/20140320222843_MnP2A.jpeg";
}

final Bitmap bitmap = getImageBitmap(imgurl);
News news = new News(titlesList.get(i).getTitle(), //文章标题
titlesList.get(i).getTitle_cn(), //文章中文标题
titlesList.get(i).getPic(), //图片地址
titlesList.get(i).getPublishTime(), //发布时间
bitmap, //新闻图片
titlesList.get(i).getCategory(), //新闻种类
titlesList.get(i).getNewsID() //新闻ID
);
mList.add(news);
}

} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}


/**
* 映射是布局
*
* @param inflater
* @param container
* @param savedInstanceState
* @return
*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mRecyclerView = (RecyclerView) inflater.inflate(R.layout.list_fragment,
container, false);
return mRecyclerView;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mRecyclerView.setLayoutManager(new LinearLayoutManager(
mRecyclerView.getContext()));
//将向适配器中传入要装填的数据
mRecyclerView.setAdapter(new RecyclerViewAdapter(getActivity(), mList));

}

/**
* 取出json数据,放到List表中
*
* @param requestData
* @throws Exception
*/
private void parseJSONWithJSONObject(String requestData) throws Exception {
Log.d("getSomething", requestData);
JSONArray jsonList = new JSONArray(requestData);
//遍历获取元素
for (int i = 0; i < jsonList.length(); i++) {
JSONObject jObject1 = new JSONObject(jsonList.getString(i));
NewsTitle newsTitle = new NewsTitle();
newsTitle.setNewsID(jObject1.getString("NewsID"));
newsTitle.setCategory(jObject1.getString("Category"));
newsTitle.setTitle(jObject1.getString("Title"));
newsTitle.setDescCn(jObject1.getString("DescCn"));
newsTitle.setDescJp(jObject1.getString("DescJp"));
newsTitle.setTitle_ip(jObject1.getString("Title_ip"));
newsTitle.setTitle_cn(jObject1.getString("Title_cn"));
newsTitle.setTopicId(jObject1.getString("TopicId"));
newsTitle.setSound(jObject1.getString("Sound"));
newsTitle.setUrl(jObject1.getString("Url"));
newsTitle.setPic(jObject1.getString("Pic"));
newsTitle.setPicDesc(jObject1.getString("PicDesc"));
newsTitle.setCreatTime(jObject1.getString("CreatTime"));
newsTitle.setPublishTime(jObject1.getString("PublishTime"));
newsTitle.setReadCount(jObject1.getString("ReadCount"));
newsTitle.setHotFlag(jObject1.getString("HotFlag"));
newsTitle.setWordCount(jObject1.getString("WordCount"));
newsTitle.setHardWeight(jObject1.getString("HardWeight"));
newsTitle.setFlag(jObject1.getString("Flag"));
newsTitle.setTFlag(jObject1.getString("TFlag"));
newsTitle.setUid(jObject1.getString("uid"));
newsTitle.setAuid(jObject1.getString("auid"));
newsTitle.setGroupid(jObject1.getString("groupid"));
newsTitle.setLikes(jObject1.getString("Likes"));
newsTitle.setDisLikes(jObject1.getString("DisLikes"));
newsTitle.setNewsfrom(jObject1.getString("newsfrom"));
newsTitle.setVFlag(jObject1.getString("VFlag"));
Log.d("getSomething", newsTitle.toString());
//添加新闻类到全局变量titlesList中
titlesList.add(newsTitle);
}

}

/**
* 下载图片
*
* @param url
* @return
*/
public Bitmap getImageBitmap(String url) {
Bitmap bitmap = null;
try {
URL imgUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imgUrl
.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
}

list_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>

运行截图如下:

Android模仿网易新闻_xml_04


FragmentAdapter.java

这是分类标题的Adapter,他主要处理了两件事:

第一件就是根据不同的position返回不同的Fragment,

另一件事是根据不同的position返回不同的title

package com.iyuba.mytablayout;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

public class FragmentAdapter extends FragmentStatePagerAdapter {
private List<Fragment> mFragments;
private List<String> mTitles;
private Context mContext;

public FragmentAdapter(FragmentManager fm,List<Fragment> fragments,List<String> titles){
super(fm);
mFragments = fragments;
mTitles = titles;
}

@Override
public Fragment getItem(int i) {
return mFragments.get(i);
}

@Override
public int getCount() {
return mFragments.size();
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mTitles.get(position);
}
}

RecyclerViewAdapter.java
用RecyclerView来代替ListView

package com.iyuba.mytablayout;


import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.iyuba.mytablayout.model.News;
import com.iyuba.mytablayout.model.NewsText;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class RecyclerViewAdapter extends RecyclerView.
Adapter<RecyclerViewAdapter.ViewHolder> {

private Context mContext; //MainAcitivity.class
private List<News> mList; //存放新闻类的表单
private String newsid; //新闻id
private static final String PARTIAL_URL = "http://192.168.3.243/getNewsContent/?newsid=";
private static final String PARTIAL_URL_TOTAL = "&total=";
private static final int PARTIAL_URL_NUMS = 1000;
private ArrayList<NewsText> textsList = new ArrayList<>();

public RecyclerViewAdapter(Context mContext) {
this.mContext = mContext;
}

public RecyclerViewAdapter(Context mContext, List<News> list) {
this.mContext = mContext;
this.mList = list;
}



@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =
LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_card_main,
parent, false);
return new ViewHolder(view);
}

/**
* 在这里将List中的数据绑定到相应的控件上
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder,
final int position) {
final ImageView imageView = holder.mImageView;
final TextView title = holder.title;
final LinearLayout linear = holder.linear;
final TextView title_cn = holder.title_cn;
final TextView url = holder.url;
final TextView datetime = holder.datetime;
final TextView catagory = holder.catagory;
//控件传值
title.setText(mList.get(position).getTitle());
//imageView.setImageResource(mList.get(position).getImg());
imageView.setImageBitmap(mList.get(position).getBitmap());
title_cn.setText(mList.get(position).getTitle_cn());
url.setText(mList.get(position).getPicUrl());
datetime.setText(mList.get(position).getDatetime());
catagory.setText(mList.get(position).getCatagory());
holder.newsId = mList.get(position).getNewsID();//获得新闻标题
//监听点击事件
linear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

String NewsID=holder.newsId;
newsid = holder.newsId;
//获取新闻id,组装成新的api,向本地服务器发送请求
final String url = PARTIAL_URL + newsid + PARTIAL_URL_TOTAL + PARTIAL_URL_NUMS;
Log.d("getSomething", url);
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
String requestData = response.body().string();
//将字符串类型的json数据进行解析,并把数据存放到textList中
parseJSONWithJSONObject(requestData);
StringBuilder sb = new StringBuilder();
StringBuilder sbr = new StringBuilder();
//获取新闻中英文内容
for (int i = 0; i < textsList.size(); i++) {
sb.append(textsList.get(i).getSentence()+"\n");
sb.append(textsList.get(i).getSentence_cn()+"\n\n");
//组装新闻标题,合成一条StringBuilder对象,以三个空格为结束标志
sbr.append(textsList.get(i).getAudioSrc()+" ");
}

Intent intent = new Intent(mContext,ContentActivity.class);
//封装新闻内容
intent.putExtra("newstext", new String(sb));
//封装新闻标题
intent.putExtra("title", mList.get(position).getTitle());
Log.d("audio",new String(sbr));
//封装新闻音频地址
intent.putExtra("audio", new String(sbr));
//进行页面条状
mContext.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
});
}

@Override
public int getItemCount() {
Log.d("getItemCount", "getItemCount:" + mList.size() + "");
return mList.size();
}

/**
* 在这里将数据指向指定的id
*/
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView title; //标题
TextView title_cn;//中文标题
TextView url; //链接
TextView datetime; //时间
ImageView mImageView; //图片
LinearLayout linear;
TextView catagory;
String newsId;

/**
* 绑定事件
* @param view
*/
public ViewHolder(View view) {
super(view);
title = view.findViewById(R.id.summary);
title_cn = view.findViewById(R.id.title_cn);
mImageView = view.findViewById(R.id.img1);
url = view.findViewById(R.id.url);
datetime = view.findViewById(R.id.datetime);
linear = view.findViewById(R.id.linear);
catagory = view.findViewById(R.id.catagory);
}
}

private void parseJSONWithJSONObject(String requestData) throws Exception {

Log.d("getSomething", requestData);
JSONArray jsonList = new JSONArray(requestData);
//遍历获取元素
for (int i = 0; i < jsonList.length(); i++) {
JSONObject jObject1 = new JSONObject(jsonList.getString(i));
NewsText newsText = new NewsText();
newsText.setAudioSrc(jObject1.getString("AudioSrc")); //音频地址
newsText.setEndTiming(jObject1.getString("EndTiming"));//结束时间
newsText.setIdIndex(jObject1.getString("IdIndex")); //id
newsText.setImgDesc(jObject1.getString("ImgDesc"));//图片描述
newsText.setImgPath(jObject1.getString("ImgPath")); //图片路径
newsText.setImgWords(jObject1.getString("ImgWords"));//图片的话
newsText.setNewsID(jObject1.getString("NewsID")); //新闻标题
newsText.setParaId(jObject1.getString("ParaId"));//段落
newsText.setSentence(jObject1.getString("Sentence"));//句子
newsText.setSentence_cn(jObject1.getString("Sentence_cn"));//中文句子
newsText.setSentence_jp(jObject1.getString("Sentence_jp"));//日本句子
newsText.setTiming(jObject1.getString("Timing")); //时间
//添加新闻类到全局变量titlesList中
textsList.add(newsText);
String imgurl;
if (i % 2 == 0) {
imgurl = "https://timgsa.baidu.com/timg?image&quality=" +
"80&size=b9999_10000&sec=1565707361598&di=72fa1" +
"d8fc2749f29ba6d159f2ef11f14&imgtype=0&src=http" +
"%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fq_70%2C" +
"c_zoom%2Cw_640%2Fimages%2F20180928%2Fa670b1f4df" +
"9741e5a6bfbe6246fb95ba.jpeg";
} else {
imgurl = "http://b-ssl.duitang.com/uploads/blog/201403/2" +
"0/20140320222843_MnP2A.jpeg";
}
final Bitmap bitmap = getImageBitmap(imgurl);
textsList.get(i).setmBitmap(bitmap);
Log.d("newstext",textsList.get(i).toString());
// Log.d("newstext",textsList.get(i).getSentence_cn());
}

}

/**
* 下载图片
* @param url
* @return
*/
public Bitmap getImageBitmap(String url) {
Bitmap bitmap = null;
try {
URL imgUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imgUrl
.openConnection();

conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}

}

list_item_card_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:paddingLeft="8dp"
android:paddingTop="8dp"
android:paddingRight="8dp">

<LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="horizontal">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<ImageView
android:id="@+id/img1"
android:layout_width="130dp"
android:layout_height="70dp"
android:background="@drawable/mao" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<TextView
android:id="@+id/datetime"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="2019-08-13"
android:textSize="12sp" />

<TextView
android:id="@+id/catagory"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="123323123"
android:textSize="12sp" />
</LinearLayout>


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="2"
android:text="Tennis:Teenage Gauff stuns Venus as Osaka, Zverev,Tisipa..."
android:textColor="#000000"
android:textSize="18sp" />

<TextView
android:id="@+id/title_cn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:ellipsize="middle"
android:singleLine="true"
android:text="网球:十几岁的戈夫让维纳斯震惊,因为...."
android:textSize="12sp" />

<TextView
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:ellipsize="middle"
android:singleLine="true"
android:text="https://www....pas-11680894"
android:textColor="#0000FF"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>

运行截图如下:

Android模仿网易新闻_android_05


ContentActivity.java

package com.iyuba.mytablayout;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;

/**
* 显示新闻内容
*/
public class ContentActivity extends AppCompatActivity implements View.
OnClickListener {

private TextView newstext; //新闻内容
private TextView newstitle; //新闻标题
private TextView mediaTime; //时间
private String time;


private ImageView btn_left,btn_right,btn_play; //播放按钮
private MediaPlayer mediaPlayer = new MediaPlayer(); //音频对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
initView();
//设置按钮监听事件
btn_left.setOnClickListener(this);
btn_right.setOnClickListener(this);
btn_play.setOnClickListener(this);

}

/**
* 初始化控件
*/
private void initView() {
newstext = findViewById(R.id.newstext);
newstitle = findViewById(R.id.newstitle);
btn_left = findViewById(R.id.btn_left);
btn_right = findViewById(R.id.btn_right);
btn_play = findViewById(R.id.btn_play);
mediaTime = findViewById(R.id.mediaTime);
Intent intent = getIntent();
//获取传过来的数据
newstext.setText(intent.getStringExtra("newstext"));
newstitle.setText(intent.getStringExtra("title"));
String audio1 = intent.getStringExtra("audio");
String[] audio = audio1.split(" "); //将音频地址逐条解析出来
//权限申请
if (ContextCompat.checkSelfPermission(ContentActivity.this,
Manifest.permission.
WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(ContentActivity.this,
new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
},1);
}else {
initMediaPlayer(); //初始化MediaPlayer
}
}

/**
* 处理监听事件
* @param view
*/
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_left: //上一篇
if(mediaPlayer.isPlaying()){
//将MediaPlayer对象重置到刚刚创建的状态
mediaPlayer.pause(); //暂停播放
}
break;
case R.id.btn_right://下一篇
if(mediaPlayer.isPlaying()){
mediaPlayer.reset(); //停止播放
initMediaPlayer();
}
break;
case R.id.btn_play: //播放键
if(!mediaPlayer.isPlaying()){
mediaPlayer.start(); //开始播放
btn_play.setImageResource(R.drawable.stop_btn);
Toast.makeText(this,"该音频时长为"+
mediaPlayer.getDuration()+"毫秒",Toast.LENGTH_SHORT).show();
}else{
btn_play.setImageResource(R.drawable.play_button);
mediaPlayer.pause(); //暂停播放
}
break;
default:
break;

}
}

/**
* 初始化音频
*/
private void initMediaPlayer() {
Log.d("123","到了吗");
File file = new File(Environment.getExternalStorageDirectory(),
"music.mp3");
try {
mediaPlayer.setDataSource("http://music.163.com/song/" +
"media/outer/url?id=28302156.mp3"); //指定音频文件的路径
mediaPlayer.prepare(); //让MediaPlayer 进入到准备状态
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 权限申请,提示用户是否同意该权限
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}else {
Toast.makeText(this,"拒绝权限将无法使用程序",
Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

/**
* 销毁音频
*/
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}

}

activity_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fadingEdge="vertical"
android:scrollbars="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ContentActivity">

<TextView
android:id="@+id/newstitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:singleLine="true"
android:text="German Grand Prix: Home comforts or more heartache for Sebastian Vettel"
android:textColor="#000000"
android:textSize="25sp"
android:textStyle="bold" />

<TextView
android:id="@+id/newstext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:text="记者是一种职业,这个行业里的许多人分不清、也不去想这个职业究竟卑微还是伟大,但他们会在珍视自己的职业精神上更多一些自作多情。所以每当一个地方出大事时,有危险时,记者常常是揣着一丝使命感的逆行者之一。国豪就是这样的同行和同事,在香港有很多和国豪一样的内地媒体记者。他们至少是值得所有人尊敬的,这些“所有人”我认为也应当包括香港的暴徒们,如果在他们的身上人性尚存的话。在暴力示威的现场围攻、迫害记者,这是多么无耻而懦弱的行径。老胡在此要对暴徒们说一句:做留有最后一点文明自尊的暴徒吧,不要把毒手对准记者。记者这个职业出现在全世界最没有秩序、最动荡、最荒诞的地方,很多杀人不眨眼的军阀恶棍都给予了记者人身安全的保证。香港的激进示威者如果连对记者都野蛮进行人身迫害,那你们自己说,我们是不是真的应该不再喊你们暴徒,而要改称你们“恐怖分子”了?"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>


</ScrollView>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/mediaTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1:30"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="25sp" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp">

<ImageView
android:id="@+id/btn_left"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@drawable/down_arrow" />

<ImageView
android:id="@+id/btn_play"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@drawable/play_button" />

<ImageView
android:id="@+id/btn_right"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:src="@drawable/up_arrow" />
</LinearLayout>
</LinearLayout>

</LinearLayout>

运行界面如下:

Android模仿网易新闻_android_06


标签:网易,layout,getString,id,jObject1,import,Android,android,模仿
From: https://blog.51cto.com/u_12606187/5959842

相关文章

  • 打开别人Android项目的方法
    将app/src/build.gradle中的所有版本号都改为和自己对应的applyplugin:'com.android.application'android{compileSdkVersion26//......
  • Android Studio Error:Connection timed out: connect.解决方案
      小编把​​Android​​ Studio升级到了2.0版本,但是遇到了这样的错误:Error:Connectiontimedout:connect.IfyouarebehindanHTTPproxy,pleaseconfigureth......
  • 更改Android Studio的主题背景
    看到别人炫酷的主题,好奇心使然,想要选择一个自己喜欢的炫酷背景,于是乎百度,动手尝试更换各种主题。保存下来,留着以后想换主题的时候看。1.AndroidStudio自带主题File->Se......
  • Android Studio中的神操作
    原文转载自:简书:柴泽建_jack网址:http://www.jianshu.com/p/bc8f6bfe12c6作为一个Android开发者,最常使用的就是AndroidStudio了,我在这里声明AndroidStudio比Eclipse好用......
  • 记录一下Android usb相关的知识学习
    在SecondStageMain中会先调用PropertyInit做属性初始化,该方法会调用PropertyLoadBootDefaults加载持久化的属性主要加载位置: /system/build.prop /system_ext/default.prop......
  • Android 设置存储修改
    源码8.1packages/apps/Settings/src/com/android/settings/deviceinfo/storage/StorageSummaryDonutPreferenceController.java/***Updatesthestateofthe......
  • Android平台GB28181设备接入模块分辨率发生变化怎么办?
    技术背景我们在做Android平台gb28181设备接入模块的时候,遇到这样的情况,比如横竖屏分辨率不锁定,采集摄像头的时候,可以实现,横屏状态采集横屏,竖屏状态采集竖屏,简单来说,横屏状态......
  • 新手 Android MVP 入门项目
    预览一下效果图,尽请期待......
  • 腾讯QTA自动化测试框架(Android/ios/Web/后台/云服务)
    QTA是一个跨平台的测试自动化工具,适用于后台、原生或混合型客户端应用的测试。更详细的介绍见下方链接:testerhome上的介绍链接:https://testerhome.com/articles/17946  开......
  • 百度APP Android包体积优化实践(四)Dex注解优化
    01前言百度APPAndroid包体积优化实践系列文章的前三篇分别介绍了体积优化的整体方案、Dex行号优化和资源优化。和Dex行号优化一样,Dex注解优化也是针对Dex文件进行的优化,但......