前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安卓UI

安卓UI

作者头像
天天Lotay
发布2022-12-01 08:28:27
1.4K0
发布2022-12-01 08:28:27
举报
文章被收录于专栏:嵌入式音视频

- Android 应用界面

界面是布局和微件的层次结构形式构建而成。布局是 ViewGroup 对象,即控制其子视图在屏幕上的放置方式的容器。微件是 View 对象,即按钮和文本框等界面组件。

- 应用组件

应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。 共有四种不同的应用组件类型: • Activity • 服务 • 广播接收器 • 内容提供程序

- 清单文件

在 Android 系统启动应用组件之前,系统必须通过读取应用的清单文件 (AndroidManifest.xml) 确认组件存在。您的应用必须在此文件中声明其所有组件,该文件必须位于应用项目目录的根目录中。

- 应用资源

应用资源是指代码使用的附加文件和静态内容,例如位图、布局定义、界面字符串、动画说明等。应将各类资源放入项目 res/ 目录的特定子目录中。

- 布局容器

布局可定义应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 View 和 ViewGroup 对象的层次结构进行构建。View 通常绘制用户可查看并进行交互的内容。然而,ViewGroup 是不可见容器,用于定义 View 和其他 ViewGroup 对象的布局结构,如图 所示。 View 对象通常称为“微件”,可以是众多子类之一,例如 Button 或 TextView。ViewGroup 对象通常称为“布局”,可以是提供其他布局结构的众多类型之一,例如 LinearLayout 或 ConstraintLayout。

- Activity

Activity类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小。 一个 Activity 在其生命周期中会经历多种状态。

  • 在 Activity 之间导航 在应用的生命周期中,应用很可能会多次进入和退出 Activity。例如,用户可以点按设备的返回按钮,或者 Activity 可能需要启动不同的 Activity。 可以使用 startActivity() 或 startActivityForResult() 方法启动新 Activity。这两种方法都需要传入一个 Intent 对象。

- 任务

任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。

- 片段

Fragment 表示 FragmentActivity 中的行为或界面的一部分。您可以在一个 Activity 中组合多个片段,从而构建多窗格界面,并在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段(这有点像可以在不同 Activity 中重复使用的“子 Activity”)。

与 Activity 生命周期协调一致

片段所在 Activity 的生命周期会直接影响片段的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个片段的类似回调。

关联Activity

  1. 使用 XML 向 Activity 添加 Fragment
代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <fragment android:name="com.example.android.fragments.HeadlinesFragment"
                  android:id="@+id/headlines_fragment"
                  android:layout_weight="1"
                  android:layout_width="0dp"
                  android:layout_height="match_parent" />

        <fragment android:name="com.example.android.fragments.ArticleFragment"
                  android:id="@+id/article_fragment"
                  android:layout_weight="2"
                  android:layout_width="0dp"
                  android:layout_height="match_parent" />

    </LinearLayout>
  1. 使用支持库 API 调用 getSupportFragmentManager() 以获取 FragmentManager。然后,调用 beginTransaction() 以创建 FragmentTransaction,并调用 add() 以添加 Fragment。

在 Fragment 之间传递数据

  1. 平级Fragment
代码语言:javascript
复制
	getParentFragmentManager().setFragmentResultListener("key", this, new FragmentResultListener() {
    @Override
    public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) {
        // We use a String here, but any type that can be put in a Bundle is supported
        String result = bundle.getString("bundleKey");
        // Do something with the result...
    }
});

另一个framgment设置结果

代码语言:javascript
复制
Bundle result = new Bundle();
result.putString("bundleKey", "result");
getParentFragmentManager().setFragmentResult("requestKey", result);
  1. 在父级 Fragment 和子级 Fragment 之间传递结果 如需将结果从子级 Fragment 传递到父级 Fragment,父级 Fragment 在调用 setFragmentResultListener() 时应使用 getChildFragmentManager() 而不是 getParentFragmentManager()。
代码语言:javascript
复制
 getChildFragmentManager().setFragmentResultListener("key", this, new FragmentResultListener() {
    @Override
	    public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) {
	        String result = bundle.getString("bundleKey");
        // Do something with the result..
	    }
});
  1. 与其他 Fragment 通信 通过共享的 ViewModel 或关联的 Activity 。 o 与 Activity 通信 片段可通过 getActivity() 访问 FragmentActivity 实例,并轻松执行在 Activity 布局中查找视图等任务
代码语言:javascript
复制
View listView = getActivity().findViewById(R.id.list);

Activity 也可使用 findFragmentById() 或 findFragmentByTag(),通过从 FragmentManager 获取对 Fragment 的引用来调用片段中的方法。

二.代码部分:

1.MyAdapter.java

代码语言:javascript
复制
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    if (convertView == null){
        // 初始化viewHolder
        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.item_list, null);
        convertView.setTag(viewHolder);

    }else{
        // 复用旧对象
        viewHolder = (ViewHolder)convertView.getTag();
    }
    // 设置textview内容
    viewHolder.textView.setText(contents.get(position));
    return convertView;
}

2.ListActivity.java

代码语言:javascript
复制
void getData2(){
    final TextView textView = (TextView) findViewById(R.id.text);
    // ...

    // 初始化 RequestQueue.
    RequestQueue queue2 = Volley.newRequestQueue(this);

    // 发起一个StringRequest 请求指定网址
    StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://www.gcu.edu.cn/main.htm",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // 在textview控件上显示最多500个字符的内容
                    textView.setText("Response is: "+ response.substring(0,500));
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // 有错误是,显示: 请求数据报错!
            textView.setText("请求数据报错!");
        }
    });

    // 放置到调度队列.
    queue2.add(stringRequest);
}

3.MyModel. java

代码语言:javascript
复制
public class MyModel extends ViewModel {
    private MutableLiveData<String> msg;
    private MutableLiveData<Integer> count;

    private  MutableLiveData<List<ImageInfo>> data;

    public MutableLiveData<Integer> getCount() {
        if (count == null) {
            count = new MutableLiveData<>();
        }
        return count;
    }

    public MutableLiveData<String> getMsg() {
        if (msg == null) {
            msg = new MutableLiveData<>();
        }
        return msg;
    }

    public MutableLiveData<List<ImageInfo>> getData() {
       if(data == null){
           data = new MutableLiveData<>();
       }
        return data;
    }
}

4.MainActivity.java

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    public static final String INFOKEY = "com.gcu.simple.infokey";
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
    }

    public void openMessage(View view){
        Intent intent = new Intent(this, InfoActivity.class);
        String msg = textView.getText().toString();
        intent.putExtra(INFOKEY, msg);
        startActivity(intent);
    }

    public void listBtn(View view){
        Intent intent = new Intent(this, ListActivity.class);
        startActivity(intent);
    }
}

5.activity main.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="1dp"
        android:layout_marginEnd="1dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0">

        <Button
            android:id="@+id/btn_msg"
            android:text="查看消息"
            android:onClick="openMessage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
             />

        <TextView
            android:id="@+id/textView"
            android:text="什么都没有"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="8dp"
             />

        <Button
            android:id="@+id/btn_data"
            android:text="数据更新及列表"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="listBtn"
             />

        <Button
            android:id="@+id/btn_style"
            style="@style/button_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="使用样式" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

6.styles.xml

代码语言:javascript
复制
<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    </style>

    <style name="button_text" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#FF0000</item>
        <item name="android:textStyle">italic</item>

    </style>

    <style name="button_text.mytextstyle" >
        <item name="android:textSize">30sp</item>
        <item name="android:textStyle">bold</item>
    </style>
</resources>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • - Android 应用界面
  • - 应用组件
  • - 清单文件
  • - 应用资源
  • - 布局容器
  • - Activity
  • - 任务
  • - 片段
  • 与 Activity 生命周期协调一致
  • 关联Activity
  • 在 Fragment 之间传递数据
  • 二.代码部分:
    • 1.MyAdapter.java
      • 2.ListActivity.java
        • 3.MyModel. java
          • 4.MainActivity.java
            • 5.activity main.xml
              • 6.styles.xml
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档