搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Monodyee
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
2021-02-24 找出克隆二叉树中的相同节点_编程查找某个二叉树中是否存在两个相同的节点
2
word2vec模型深度解析
3
git学习笔记:配置SSH公钥及创建远程仓库_gitcode设置ssh公钥
4
文心一言 VS ChatGPT-4_文言一心和chatgpt4
5
鸿鹄电子招投标系统:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程
6
NLP学习笔记(三):模型训练之深度学习方案详解(关键词:深度学习,词向量,RNN,LSTM)_模型训练 是关键词吗
7
什么是基于角色的访问控制 (RBAC)?示例、好处等
8
迅为i.MX6ULL开发板-移植OpenCv2.4.9-搭建OpenCv编译环境_imx6ull 编译 opencv
9
数字经济专家高泽龙谈“金融元宇宙”与“元宇宙金融”
10
C++风格指南(Google版)_c++copyfrom
当前位置:
article
> 正文
android学习笔记——Fragment最佳实践_新闻列表构造newsadapter适配器类继承arrayadapter
作者:Monodyee | 2024-04-03 11:26:04
赞
踩
新闻列表构造newsadapter适配器类继承arrayadapter
接着上一节我们讲过的Fragment的用法,使用一个APP,为不同屏幕尺寸的设备显示不同的界面(根据屏幕分辨率大小进行分页处理)
使用Fragment做一个新闻的展示。
先明白我们要干什么:
当使用手机进行浏览时,因为手机屏幕分辨率有限,所以决定只支持单页的显示方式。
当使用平板进行浏览时,对于更高的分辨率,选择使用双页的显示方式。(如果是真有钱,还是推荐再搞一个平板版本的吧)
好,知道要干什么,就得定一下我们具体该怎么实现了。
1.有新闻这个类,里边包含俩属性,一个标题,一个内容
2.新建一个news_item.xml布局,用于作为新闻列表子项的布局
3.创建新闻列表的适配器(NewsAdapter),继承自ArrayAdapter,且泛型类为News类
以上基本就是新闻的列表部分,我们还需要看到新闻的内容部分
4.给新闻内容部分写布局文件news_content_frag.xml(在展示时要展示标题以及内容哦)
5.新建一个NewsContentFragment类,继承自Fragment。就是要和刚才创建的布局进行绑定,与此同时,我们还应该在这个类里做些什么事情(一会再说)
我们可以看出来,4、5其实是针对双页面,使用Fragment时所要做的事情。接下来我们做一下单页面的新闻内容显示。
6.创建一个在活动中使用的新闻内容布局 news_content.xml (在单页模式下,我们还是要用Activity的方式进行使用)
7.然后新建NewsContentActivity,作为显示新闻内容的活动,他所要做的活动其实和之前的NewsContentFragment所做的是一样的,所以之后我们会在这里做一个代码的复用~
8.还需要一个用于显示新闻列表的布局,news_title_frag.xml 这个是给碎片用的(这么说可能有所不妥,毕竟是两种展示方式都用到了这个标题的布局,属于两者复用的一个地吧)。
9.创建一个碎片(NewsTitleFragment类)来加载上一个布局。(我们把他作为一个非常重要的文件来编写。)
10.修改一下activit_main.xml的文件内容,用<fragment>来引入程序的开始
11.新建一个文件夹,叫layout-sw600dp。在其中新建一个activity_main.xml,其中就是两个fragment来进行双页模式的布局显示。
好啦好啦,说了那么多自己都被搞晕了。开始做吧!
1.新闻类
public class
News {
private
String
title
;
private
String
content
;
public
String getTitle(){
return
title
;
}
public
String getContent(){
return
content
;
}
public void
setTitle(String title){
this
.
title
= title;
}
public void
setContent(String content){
this
.
content
= content;
}
}
2.新建一个news_item.xml布局,用于作为新闻列表子项的布局
<
LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
android
:orientation=
"vertical"
>
<
TextView
android
:id=
"@+id/news_title"
android
:layout_width=
"match_parent"
android
:layout_height=
"wrap_content"
android
:singleLine=
"true"
android
:ellipsize=
"end"
android
:textSize=
"18sp"
android
:paddingLeft=
"10dp"
android
:paddingRight=
"10dp"
android
:paddingTop=
"15dp"
android
:paddingBottom=
"15dp"
/>
</
LinearLayout
>
3.创建新闻列表的适配器(NewsAdapter),继承自ArrayAdapter,且泛型类为News类
public class
NewsAdapter
extends
ArrayAdapter<News> {
private int
resourceId
;
public
NewsAdapter(Context context,
int
textViewResourceId, List<News> objects) {
super
(context, textViewResourceId, objects);
resourceId
= textViewResourceId;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
News news = getItem(position);
if
(convertView ==
null
){
convertView = LayoutInflater.
from
(getContext()).inflate(
resourceId
,
null
);
}
TextView newsTitleText = (TextView) convertView.findViewById(R.id.
news_title
);
newsTitleText.setText(news.getTitle());
return
convertView;
}
}
这样就可以获取得到新闻标题的部分了
然后我们需要写一下双页面时右边部分的展示
4.给新闻内容部分写布局文件news_content_frag.xml(在展示时要展示标题以及内容哦)
<
RelativeLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
<
LinearLayout
android
:id=
"@+id/visibility_layout"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
android
:orientation=
"vertical"
android
:visibility=
"invisible"
>
<
TextView
android
:id=
"@+id/news_title"
android
:layout_width=
"match_parent"
android
:layout_height=
"wrap_content"
android
:gravity=
"center"
android
:padding=
"10dp"
android
:textSize=
"20sp"
/>
<
ImageView
android
:layout_width=
"match_parent"
android
:layout_height=
"2dp"
android
:background=
"#f23"
android
:scaleType=
"fitXY"
/>
<
TextView
android
:id=
"@+id/news_content"
android
:layout_width=
"match_parent"
android
:layout_height=
"0dp"
android
:layout_weight=
"1"
android
:padding=
"15dp"
android
:textSize=
"18sp"
/>
</
LinearLayout
>
<
ImageView
android
:layout_width=
"2dp"
android
:layout_height=
"match_parent"
android
:background=
"#f23"
android
:scaleType=
"fitXY"
/>
</
RelativeLayout
>
5.新建一个NewsContentFragment类,继承自Fragment。就是要和刚才创建的布局进行绑定,与此同时,我们还应该在这个类里做些什么事情。
public class
NewsContentFragment
extends
Fragment {
private
View
view
;
@Nullable
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view
= inflater.inflate(R.layout.
news_content_frag
,container,
false
);
return
view
;
}
public void
refresh(String newsTitle,String newsContent){
View visibilityLayout =
view
.findViewById(R.id.
visibility_layout
);
visibilityLayout.setVisibility(View.
VISIBLE
);
TextView newsTitleText = (TextView) visibilityLayout.findViewById(R.id.
news_title
);
TextView newsContentText = (TextView) visibilityLayout.findViewById(R.id.
news_content
);
newsTitleText.setText(newsTitle);
//刷新新闻的标题
newsContentText.setText(newsContent);
//刷新新闻的内容
}
}
在这个方法中,我们编写了一个refresh的方法用来进行新闻数据的刷新。在此我们就应该进行思考,有关新闻数据内容的展示,不论在单页模式下还是双页模式下,布局是极为相似甚至是一样的,所以在这里我们应该判断关于新闻内容的展示部分应该是可以进行复用的。好,到此为止,我们继续进行。
6.创建一个在活动中使用的新闻内容布局 news_content.xml (在单页模式下,我们还是要用Activity的方式来使用)
<
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"
>
<
fragment
android
:id=
"@+id/news_content_fragment"
android
:name=
"com.example.yawen_li.fragmentbestpratice.NewsContentFragment"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
tools
:layout=
"@layout/news_content_frag"
/>
</
LinearLayout
>
7.然后新建NewsContentActivity,作为显示新闻内容的活动,他所要做的活动其实和之前的NewsContentFragment所做的是一样的,所以之后我们会在这里做一个代码的复用~
public class
NewsContentActivity
extends
AppCompatActivity {
public static void
actionStart(Context context,String newsTitle,String newsContent){
Intent intent =
new
Intent(context,NewsContentActivity.
class
);
intent.putExtra(
"news_title"
,newsTitle);
intent.putExtra(
"news_content"
,newsContent);
context.startActivity(intent);
}
@Override
protected void
onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.
FEATURE_NO_TITLE
);
super
.onCreate(savedInstanceState);
setContentView(R.layout.
news_content
);
String newsTitle = getIntent().getStringExtra(
"news_title"
);
//获取传入的新闻标题
String newsContent = getIntent().getStringExtra(
"news_content"
);
//获取传入的新闻内容
NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.
news_content_fragment
);
newsContentFragment.refresh(newsTitle,newsContent);
//刷新NewsContentFragment界面
}
}
以上两步,就该贯彻了之前我们所讲的代码复用的点了。用Activity来包裹Fragment进行展示,提高了代码的复用率,当然一定要思路清晰,编写好文档,方便以后再回忆时帮助自己记起这些内容。
8.还需要一个用于显示新闻列表的布局,news_title_frag.xml 这个是给碎片用的(两种模式其实是复用了这一个布局)。
<
LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
android
:orientation=
"vertical"
>
<
ListView
android
:id=
"@+id/news_title_list_view"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
</
ListView
>
</
LinearLayout
>
9.创建一个碎片(NewsTitleFragment类)来加载上一个布局。(我们把他作为一个非常重要的文件来编写。)
在这里,我们要进行一些工作,着重讲一下这个类。
1.在这里利用Fragment的生命周期相对Activity靠前的特性,在onAttach()中加载一下数据,new一下adapter
2.在onCreateView()中初始化布局,设置adapter(别忘了设置一下item的点击事件)
3.在onActivityCreated()中对设备屏幕分辨率进行判别(当使用小屏幕手机时,会根据限定符的原因自动屏蔽掉另一个activity_main.xml文件,所以我们只需要查看一下这个文件是否存在即进行了是否使用双页模式)
4.可以在onItemClick()中将双页模式进行分类启动与内容填充。
5.记得写一下新闻数据的初始化。
至此,这个类中要做的事情就已经结束了。看代码部分
public class
NewsTitleFragment
extends
Fragment
implements
AdapterView.OnItemClickListener {
private
ListView
newsTitleListView
;
private
List<News>
newsList
;
private
NewsAdapter
adapter
;
private boolean
isTwoPane
;
@Override
public void
onAttach(Activity activity) {
super
.onAttach(activity);
newsList
= getNews();
//初始化新闻数据
adapter
=
new
NewsAdapter(activity,R.layout.
news_item
,
newsList
);
}
@Nullable
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.
news_title_frag
,container,
false
);
newsTitleListView
= (ListView) view.findViewById(R.id.
news_title_list_view
);
newsTitleListView
.setAdapter(
adapter
);
newsTitleListView
.setOnItemClickListener(
this
);
return
view;
}
@Override
public void
onActivityCreated(Bundle savedInstanceState) {
super
.onActivityCreated(savedInstanceState);
if
(getActivity().findViewById(R.id.
news_content_layout
) !=
null
){
isTwoPane
=
true
;
//可以找到news_content_layout布局时,为双页模式
}
else
{
isTwoPane
=
false
;
//找不到news_content_layout布局时,为单页模式
}
}
@Override
public void
onItemClick(AdapterView<?> parent, View view,
int
position,
long
id) {
News news =
newsList
.get(position);
if
(
isTwoPane
){
//如果是双页模式,则刷新NewsContentFragment中的内容
NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.
news_content_fragment
);
newsContentFragment.refresh(news.getTitle(),news.getContent());
}
else
{
//如果是单页模式,则直接启动NewsContentActivity
NewsContentActivity.
actionStart
(getActivity(),news.getTitle(),news.getContent());
}
}
private
List<News> getNews(){
List<News> newsList =
new
ArrayList<News>();
News news1 =
new
News();
news1.setTitle(
"我是News1的新闻标题"
);
news1.setContent(
"我是News1的新闻主体内容"
);
newsList.add(news1);
News news2 =
new
News();
news2.setTitle(
"我是News2的新闻标题"
);
news2.setContent(
"我是News2的新闻主体内容"
);
newsList.add(news2);
return
newsList;
}
}
大家在看这段代码的时候要多回去想想我们要做的事情以及事情的经过是怎样的,反复记忆与思考。其实想想也不难,难点就是在执行的顺序上的问题了。
10.修改一下activit_main.xml的文件内容,用<fragment>来引入程序的开始
<
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
:paddingLeft=
"@dimen/activity_horizontal_margin"
android
:paddingRight=
"@dimen/activity_horizontal_margin"
android
:paddingTop=
"@dimen/activity_vertical_margin"
android
:paddingBottom=
"@dimen/activity_vertical_margin"
tools
:context=
".MainActivity"
>
<!-- 在name中加载了一个Fragment的类,然后进行了包裹嵌套 -->
<
fragment
android
:id=
"@+id/news_title_fragment"
android
:name=
"com.example.yawen_li.fragmentbestpratice.NewsTitleFragment"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
tools
:layout=
"@layout/news_item"
/>
</
LinearLayout
>
11.新建一个文件夹,叫layout-sw600dp。在其中新建一个activity_main.xml,其中就是两个fragment来进行双页模式的布局显示。
<
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"
>
<
fragment
android
:id=
"@+id/news_title_fragment"
android
:name=
"com.example.yawen_li.fragmentbestpratice.NewsTitleFragment"
android
:layout_width=
"0dp"
android
:layout_height=
"match_parent"
android
:layout_weight=
"1"
tools
:layout=
"@layout/news_title_frag"
/>
<
FrameLayout
android
:id=
"@+id/news_content_layout"
android
:layout_width=
"0dp"
android
:layout_height=
"match_parent"
android
:layout_weight=
"1"
>
<
fragment
android
:id=
"@+id/news_content_fragment"
android
:name=
"com.example.yawen_li.fragmentbestpratice.NewsContentFragment"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
tools
:layout=
"@layout/news_content_frag"
/>
</
FrameLayout
>
</
LinearLayout
>
在这里我们能很好的看到程序的入口,以及分双页显示的开始是从哪块代码开启的。
回头再看看Fragment的生命周期吧,好好理解Fragment和Activity之间的联系,才能在代码中正确的编写。
真的让我好生思考才明白过来啊。现在想想其实没多难,就是最简单最基本的调用。我们在遇到一个关键点的时候千万回归他的本质,别被眼花缭乱的代码扰乱了自己的思路。脚踏实地才是技术学习唯一的出路呀。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Monodyee/article/detail/355323
推荐阅读
article
【
Android
学习】
Android
APK
签名
原理_
apk
公钥
...
然后,再逐条计算 MANIFEST.MF 文件中每一个块的 SHA1,并经过 BASE64 编码后,记录在 CERT.S...
赞
踩
article
Android
生成
keystore
证书
并查看 MD5 等签名信息(
Android
Studio
...
唯一判别名,cn 所有者名称,ou 组织单位名称,o 组织名称,l 城市或区域名称,st 州或省份名称,c 两字母国家代...
赞
踩
article
Android
获取
APK的
签名
秘钥
keystore
_提取
apk
签名
密钥...
===========【
获取
release包
签名
秘钥
】=========找到release
签名
在项目对应的目录1:进入签...
赞
踩
article
Android
、IOS客户端
RSA
密钥
生成
_
android
公钥
...
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你...
赞
踩
article
Android
网络
备案
公钥获取详情_
android
app
备案
公钥...
自己笔记:网w站
备案
APP 特征信息填写参考规范-
备案
准备-文档中心-腾讯云...
赞
踩
article
android
命令
创建
签名
文件
keystore
、修改已有
keystore
的别名密码、密钥库密码,重...
由于现在开发
android
JDK基本都是用的1.7及以上,所以低版本的JDK的就不记录了。首先找到一个文件夹,以下操作...
赞
踩
article
[
Android
Pro]
Android
签名
与认证
详细分析
之二(
CERT
.
RSA
剖析)...
转载自: http://www.thinksaas.cn/group/topic/335449/ http://b...
赞
踩
article
【
Android
安全】
Android
app
开发者
证书
和代码
签名
机制
_
apk
签名
subjectke...
【
Android
安全】
Android
app
开发者
证书
和代码
签名
机制
_
apk
签名
subjectkeyidentifie...
赞
踩
article
Android
调试
:
java
跨工程
调试
android
项目
_
java
项目
中运行
android
....
这篇博客适合:* 使用 Eclipse + ADT 开发
android
项目
的 coder* 知道和使用过 Build...
赞
踩
article
Android
Studio
中调试Java代码_在
android
studio
中进行
java
程序调试
...
在写
Android
项目的时候,经常需要验证一些Java功能,但是直接在项目里写,还得重启项目,非常不方便。其实Andro...
赞
踩
article
Android
Java
学习笔记一 如何运行调试
第一个
Android
Java
程序_apk(
s
)...
这里我们不会写一行代码, 而是利用向导选择一个应用模板建立一个最简单的App, 记录下如何在模拟器和小米机器上编译 运行...
赞
踩
article
Android
Java
代码执行
adb
Shell
命令_android
java
文件怎么执行
adb
...
Android
Java
代码执行
adb
Shell
命令通过
java
代码代替
adb
命令增加工具类
Shell
Utils.ja...
赞
踩
article
android
webview
63
,微信切换上线文
WEBVIEW
_
com
.
tencent
.
mm
:...
控制台报错信息:selenium.
com
mon.exceptions.WebDriverException: Messa...
赞
踩
article
Appium DeskTop连接模拟器(真机)测试报错Coul
d
not
fin
d
a
connec...
一、问题描述测试小白,学习自动化测试,连接夜神模拟,真机也试过了,同样报错,这是问题是迄今为止我遇到最
d
er(东北话)的...
赞
踩
article
Android
emulator
无法
启动
的解决方法
_
没都会弹
android
emulator
cl...
现象: 在
启动
Android
emulator
时出现"
emulator
: ERROR: unknown virtual ...
赞
踩
article
appium
环境
搭建总结以及
Python
+
appium
+
android
-
sdk
+夜神
模拟器
启动一个Q...
再来记录一篇关于
appium
环境
搭建.这个其实一百度,有很多大v
的
文章,我记录在这里主要是方便自己以后查阅,省得去东找西...
赞
踩
article
Android
Studio
自带
模拟器
启动无响应_
android
emulator
closed
u...
Android
Studio
自带
模拟器
启动无响应环境:Win10 + Intel处理器在一台全新的电脑上安装Androi...
赞
踩
article
解决
android
Emulator
closed
..gpu
found
报错_
android
...
android
Emulator
closed
..gpu
found
功能快捷键合理的创建标题,有助于目录的生成如何改变...
赞
踩
article
Android
studio
emulator
Terminated...
长话简说使用adroid
studio
进行学习的时候,刚刚创建的
emulator
居然打不开了,显示进程被终止,然后就是...
赞
踩
article
android
自动
重启
测试
,
求助~ 运行
appium
测试
安卓真机时,应用不停的
重启
...
我用的是真机 安卓 4.4.3 的智能电视,执行脚本后被调应用不停的
重启
, 求助啊 各位有没有遇到过的啊看日志没有什么异...
赞
踩
相关标签
android
学习
flutter
android studio
ide
java
密码学
https
网络安全
安全
jdk
keystore
重新签名
移动开发
Android
linux
Linux
LINUX