『Android Studio』用Fragment实现一个简易新闻浏览界面

2023-11-06

Fragment意思为碎片、片段。
在Android中有些Activity在手机上看起来很美观,但放在屏幕更大的平板类的设备上,可能就不一样了,而Fragment能在一个Activity中内嵌多个独立的小Activity,有效的解决了app在大屏设备上的显示问题。

运行环境

  • Windows 10
  • Android Studio Arctic Fox (2020.3.1)
  • jdk1.7.0_67

新建一个项目

添加控件

在布局文件activity_main.xml中添加两个FrameLayout控件。

<FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/leftcontainer"
        android:layout_weight="2">
    </FrameLayout>
    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/rightcontainer"
        android:layout_weight="3">
    </FrameLayout>

android:layout_width="0dp"android:layout_weight="2"需要搭配使用,表示id为leftcontainer的占屏幕的2份(即2/5),id为rightcontainer占屏幕3份(即3/5)。

新建Fragment

在Android Studio界面中点击右上角的File,依次选择new->Java Class,命名为LeftFragmentRightFragment。 再点击new->XML->layout XML File,命名为leftfragmentlayout,rightfragmentlayout
布局文件名不可大写。
在LeftFragment.java和RightFragment.java中继承Fragment。注意Fragment的版本。
20211101224054.jpg
接着输入

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view=inflater.inflate(R.layout.leftfragmentlayout,container,false);

在新建的两个布局文件中输入以下代码。

//leftfragmentlayout.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:background="#cccc11">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/title_list"/>
</LinearLayout>
//rightfragmentlayout.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:background="#fcabff">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_title"
        android:gravity="center" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tv_content" />

</LinearLayout>

android:background="#fcabff"是为了能区分两个Fragment,实际操作中不需要这个。

初始化

在MainActivity中对新建的Fragment初始化。

private void initView() {
        LeftFragment leftFragment=new LeftFragment();
        RightFragment rightFragment=new RightFragment();
        FragmentManager manager=getSupportFragmentManager();
        FragmentTransaction transaction=manager.beginTransaction();
        transaction.add(R.id.leftcontainer,leftFragment);
        transaction.add(R.id.rightcontainer,rightFragment);
        transaction.commit();
    }

数据传递

定义数据,我们直接给 Fragment几串数据。

private String[] titles={"标题1","标题2","标题3"}
private String[][] titlesAndContents={{"标题1","正文1"},{"标题2","正文2"},{"标题3","正文3"}

public String[] getTitles() {
return titles;
}
public String[][] getTitlesAndContents() {
return titlesAndContents;
}

数据接收
LeftFragment

//LeftFragment.java


private  View view;
private String[] titles;
private String[][] titlesAndContents;
private ListView listView;
//此处省略了一部分代码,在上文已经写过。

MainActivity mainActivity=(MainActivity) getActivity();
titles=mainActivity.getTitles();
titlesAndContents=mainActivity.getTitlesAndContents();
if(view!=null){
listView=view.findViewById(R.id.title_list);
MyAdapter adapter=new MyAdapter(getContext(),titles);
listView.setAdapter(adapter);
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 在LeftFragment中获取RightFragment的实例
RightFragment rightFragment=(RightFragment) ((MainActivity)getActivity()).getSupportFragmentManager().findFragmentById(R.id.rightcontainer);
rightFragment.setText(titlesAndContents[position]);
}
});
return view;

RightFragment

//RightFragment.java
private View view;
private String[][] titlesAndContents;
private TextView tv_title,tv_content;

//此处省略了一部分代码,在上文已经写过。

MainActivity mainActivity=(MainActivity) getActivity();
        titlesAndContents=mainActivity.getTitlesAndContents();
        if(view!=null){
            tv_title=(TextView) view.findViewById(R.id.tv_title);
            tv_content=(TextView)view.findViewById(R.id.tv_content);
            setText(titlesAndContents[0]);
        }
        return view;
    }
    public  void setText(String[] strings){
        tv_title.setText(strings[0]);
        tv_content.setText(strings[1]);
    }
}

上述代码省略了导包的代码,请自己添加(波浪线处按住Alt+Enter)。

自定义适配器

为了能在Activity中自由切换我们还需要自定义一个适配器。
新建一个MyAdapter.java

public class MyAdapter extends BaseAdapter {
    private Context context;
    private String[] titles;

    public MyAdapter(Context context, String[] titles) {
        this.context = context;
        this.titles = titles;
    }

    @Override
    public int getCount() {
        return titles.length;
    }

    @Override
    public Object getItem(int position) {
        return titles[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        if(convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.title_item_layout,null);
            holder=new ViewHolder();
            holder.textView=(TextView)convertView.findViewById(R.id.tv_title);
            convertView.setTag(holder);
        }else{
            holder=(ViewHolder) convertView.getTag();
        }
        holder.textView.setText(titles[position]);
        return convertView;
    }
    class ViewHolder{
        TextView textView;
    }
}

最终效果

2021-11-01 23-11-3820211112316152.gif

完整代码下载连接
ECHK1NG’s 学习之路(文章末尾)
CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

『Android Studio』用Fragment实现一个简易新闻浏览界面 的相关文章

  • Twitter 登录说明

    我想在 Android 中创建一个 Twitter 应用程序 为此 我想创建一个登录页面并登录到 Twitter 为此 我们需要消费者密钥和消费者密钥 这是什么意思 要创建此登录页面 除了 Twitter 帐户之外 我们还需要其他任何东西吗
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 调整浮动操作按钮的图标大小(fab)

    The new floating action button should be 56dp x 56dp and the icon inside it should be 24dp x 24dp So the space between i
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 如何修改 Skobbler 注释而不重新添加它

    我必须修改 SKAnnotation 的图像 注释生成器代码 private SKAnnotation getAnnotationFromView int id int minZoomLvl View view SKAnnotation a
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大

随机推荐