【Android Studio】一款简易appUI界面开发(1)

简易垃圾识别App界面设计
本文分享了作者作为新手,自学并使用安卓组件设计的一款简易垃圾识别App界面的过程。文章详细记录了在侧边栏、调用摄像头等功能实现中遇到的问题及解决方案,包括使用正确的安卓组件库和解决Android7.0以上版本的摄像头权限问题。

一款简易垃圾识别app界面设计

本人萌新,由于某位大佬弄学术基金想做个垃圾识别app的原因,就被迫为这款app整个UI界面,然鹅又因为学院并没有开设java课程的原因,只好自学加上东拼西凑,恰逢疫情不用开学,便用在家里的时间做了一款简易界面
(图片是另一位负责美工的同学做的)
在这里插入图片描述
由于是自学,中途实在遇到太多坑,在这里便记录下来方便大家学习

侧边栏

在寻找侧边栏这方面的资料时,发现大多数博客都是基于
android.support.v4.widget.DrawerLayout
这个官方包去做的,但不知是新版本不适用还是其他原因,博主并不能导入这个包,在v4这里会出错。在尝试各种方法去找这个包都无法成功后,就放弃了导入这个包的想法;在找了很久博客后终于发现另一个能导入的包
androidx.drawerlayout.widget.DrawerLayout
另外附加一篇博主参考过的博客
侧滑菜单简单实现

调用摄像头

在调用摄像头这块,博主刚开始是参考大神博客上的方式去仿照,获取摄像头权限,点击按钮调用摄像头
在这里插入图片描述
结果虽然程序没有错误,但每次点击调用摄像头的按钮程序都会闪退,后来上网一查发现是Android 7.0以上的版本摄像头权限方面有了改变,需要做调整。于是博主又找了许多博客找相关问题,很多都是在onCreate方法里增加代码,又或者是长篇大论的,博主虽然看不懂,但每一个都试了一下,都对博主不行;最后在绝望关头,发现一篇博客
Android 7.0以后相机闪退解决方法

原来问题出在**<uses-permission android:name=“android.permission.CAMERA”**,这一句要删掉。
虽然不知道是什么原因,不过确实帮博主解决了问题。

最后贴一下各部分的代码图供大家学习,本人萌新,望海涵

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_drawer_layout">



    <LinearLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFF"
        android:orientation="vertical">
        <!--顶部栏-->
        <include layout="@layout/top_bar"
            android:id="@+id/top_view_bar"/>

        <TextView
            android:id="@+id/title"
            android:layout_marginTop="64dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="智能垃圾识别"
            android:textSize="40dp"
            android:layout_gravity="center"/>

        <!--摄像头按钮-->

        <ImageButton
            android:id="@+id/camerabutton"
            android:layout_width="240dp"
            android:layout_height="240dp"
            android:layout_gravity="center"
            android:layout_marginTop="64dp"
            android:background="@null"
            android:src="@mipmap/main_saomiao" />

        <TextView
            android:id="@+id/search"
            android:layout_width="wrap_content"
            android:layout_height="84dp"
            android:layout_gravity="center"
            android:layout_marginTop="24dp"
            android:text="扫描识别"
            android:textSize="24sp" />

    </LinearLayout>

    <!--左侧滑动栏-->
    <LinearLayout
        android:id="@+id/left_layout"
        android:layout_width="600px"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#FFFFFF"
        android:orientation="vertical">

        <Button
            android:layout_width="match_parent"
            android:layout_height="180px"
            android:id="@+id/guanyu"
            android:background="@drawable/selector"
            android:layout_marginRight="10dp"
            android:text="关于\nAbout me"
            android:drawableLeft="@mipmap/guanyu"
            android:paddingRight="30dp"
            android:paddingLeft="10dp"
            android:textSize="18dp"/>

        <Button
            android:id="@+id/fenxiang"
            android:layout_width="match_parent"
            android:layout_height="164px"
            android:background="@drawable/selector"
            android:drawableLeft="@mipmap/fenxiang"
            android:text="分享"
            android:paddingRight="85dp"
            android:paddingLeft="20dp"
            android:textSize="18dp"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="164px"
            android:id="@+id/yijian"
            android:background="@drawable/selector"
            android:drawableLeft="@mipmap/yijian"
            android:text="意见反馈"
            android:paddingRight="55dp"
            android:paddingLeft="20dp"
            android:textSize="18dp"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="164px"
            android:id="@+id/yinsi"
            android:background="@drawable/selector"
            android:drawableLeft="@mipmap/yinsi"
            android:text="隐私协议"
            android:paddingRight="50dp"
            android:paddingLeft="20dp"
            android:textSize="18dp"/>
    </LinearLayout>

</androidx.drawerlayout.widget.DrawerLayout>

tor_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:id="@+id/top_view_bar"
    android:layout_height="48dp">
    <ImageView
        android:id="@+id/top_view_left_iv"
        android:layout_gravity="center"
        android:paddingLeft="-20dp"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@mipmap/main_menu"/>

    <ImageView
        android:layout_width="48dp"
        android:layout_height="48dp"
        />
</LinearLayout>

MainActivity.java

package com.example.myapplication1;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;


public class MainActivity extends Activity {

    //侧面栏
    private Button mbt1;
    private Button mbt2;
    private Button mbt3;
    private Button mbt4;

    private static int REQ_1=1;
    private ImageView mImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageView= findViewById(R.id.show_image);


        mbt1=findViewById(R.id.guanyu);
        mbt2=findViewById(R.id.fenxiang);
        mbt3=findViewById(R.id.yijian);
        mbt4=findViewById(R.id.yinsi);


        final DrawerLayout drawerLayout = findViewById(R.id.main_drawer_layout);
        findViewById(R.id.top_view_left_iv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //打开侧滑菜单
                drawerLayout.openDrawer(GravityCompat.START);

        }
        });

        //为侧面栏按钮添加点击事件
        mbt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setFocusable(true);
                v.requestFocus();
                v.requestFocusFromTouch();

            }
        });
        mbt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setFocusable(true);
                v.requestFocus();
                v.requestFocusFromTouch();
            }
        });
        mbt3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setFocusable(true);
                v.requestFocus();
                v.requestFocusFromTouch();
            }
        });
        mbt4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setFocusable(true);
                v.requestFocus();
                v.requestFocusFromTouch();
            }
        });

    }

    public void startCamera(View view){
        Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent,REQ_1);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode==RESULT_OK){
            if (requestCode==REQ_1){
                Bundle bundle=data.getExtras();
                Bitmap bitmap=(Bitmap)bundle.get("data");
                mImageView.setImageBitmap(bitmap);
            }
        }
    }


}



AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.detectiondemo">
    <uses-permission android:name="android.permission.CAMERA" />
    <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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
    </application>

</manifest>

结语

后面如果更改的话,估计会增加自定义相机这部分的内容,到时候改的话再更新
最后呈上另外参考过的博客并感谢
点击Button更换颜色
以及一个博主认为超实用的查看Android Studio各颜色代码的博客
Android Studio颜色码

<think>好的,我现在需要回答用户关于如何在Android Studio中查看编辑App的UI代码的问题。首先,我得回想一下Android Studio的基本结构,特别是UI相关的部分。用户可能指的是XML布局文件或者通过代码动态创建UI的方式。 根据引用[4],里面提到了通过Java代码控制UI界面,比如在MainActivity中动态创建FrameLayoutTextView。这说明UI可以通过代码或者XML布局来定义。不过通常来说,Android应用更常用XML布局文件来设计UI,这样更直观易于维护。 首先,我应该指导用户找到XML布局文件的位置。在Android Studio的项目结构中,布局文件通常放在res/layout目录下。用户需要知道如何在这个目录下找到对应的XML文件,比如activity_main.xml,然后双击打开进行编辑。这时候,用户可以看到设计视图代码视图,可以切换查看。 另外,引用[4]中的例子展示了如何在Java代码中动态添加组件,比如创建FrameLayoutTextView,并设置它们的属性。用户可能也需要了解这部分内容,但问题更偏向于“查看编辑”,所以重点应该放在XML布局文件上。 接下来,我需要分步骤说明如何在Android Studio中操作。首先,打开项目后,在左侧的Project面板中找到res/layout目录,展开后可以看到所有的布局文件。双击一个文件,比如activity_main.xml,就会在编辑器中打开。用户这时可以选择底部的Design或Code标签来切换视图。Design视图是可视化的布局编辑器,可以拖放组件;Code视图则是直接编辑XML代码的地方。 可能还需要提到如何预览布局,比如使用Preview面板查看不同设备或方向的显示效果。此外,如果用户想通过代码动态修改UI,可以参考引用[4]中的例子,在Activity的Java或Kotlin文件中找到onCreate方法,里面通常会通过setContentView设置布局,之后可以通过findViewById获取组件并修改属性。 用户的问题也可能涉及到如何查找特定UI元素对应的代码。这时候需要说明如何从布局文件中找到组件的id,然后在Activity或Fragment中使用这个id来引用组件。比如,在XML中有一个TextView,其id为text_view,那么在代码中可以通过TextView textView = findViewById(R.id.text_view);来获取并修改其属性。 此外,需要注意提醒用户,如果UI是通过代码动态创建的(如引用[4]中的例子),那么布局不是在XML中,而是直接在Java/Kotlin代码中构建的。这时候用户需要查看对应的Activity类文件,比如MainActivity.java或MainActivity.kt,找到onCreate方法中的UI构建部分。 可能还需要提到一些快捷键或工具,比如在布局文件中按住Ctrl(或Cmd)点击组件id,可以直接跳转到代码中的使用位置,或者使用Find Usages功能查找组件在代码中的引用。 最后,根据用户提供的引用,特别是引用[3]关于测试的内容,可能不需要涉及测试部分,但可以简要提及在修改UI后如何进行预览或运行应用查看效果。不过用户的问题主要集中在查看编辑代码,所以这部分可能不是重点。 总结回答的结构应该是先介绍XML布局文件的位置编辑方式,然后说明如何通过代码动态修改UI,并引用相关的例子。同时,注意步骤清晰,分点说明,帮助用户逐步找到所需的UI代码部分。</think>在 Android Studio 中查看编辑 App UI 代码,可通过以下两种主要方式实现: --- ### 一、通过 XML 布局文件(推荐方式) 1. **定位布局文件** - 打开项目后,在左侧 **Project 面板** 展开 `app > res > layout` 目录 - 双击目标 XML 文件(如 `activity_main.xml`)打开编辑界面[^4] 2. **切换视图模式** - **Design 视图**:可视化拖拽组件,查看实时预览 - **Code 视图**:直接编辑 XML 代码(示例格式): ```xml <TextView android:id="@+id/my_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> ``` 3. **组件属性调试** - 在右侧 **Attributes 面板** 修改组件属性(如字体、颜色) - 使用 **Preview 面板** 查看不同设备/屏幕方向的渲染效果 --- ### 二、通过 Java/Kotlin 代码动态构建 UI 若 UI 通过代码动态创建(如引用[4]的示例): 1. **定位 Activity 类文件** - 打开 `java/[包名]` 目录下的 Activity 文件(如 `MainActivity.java`) - 在 `onCreate()` 方法中查找 UI 构建代码 2. **查看动态构建逻辑** ```java // 示例:代码创建 TextView FrameLayout frameLayout = new FrameLayout(this); setContentView(frameLayout); // 设置根布局 TextView mTextView = new TextView(this); mTextView.setText("动态创建的文本"); frameLayout.addView(mTextView); // 添加组件到布局 ``` --- ### 三、双向关联技巧 - **从 XML 跳转到代码** 在布局文件中按住 `Ctrl`(Mac 按 `Cmd`)点击组件 ID,自动跳转到代码中 `findViewById()` 的使用位置 - **从代码定位 XML** 在 Java/Kotlin 文件中按住 `Ctrl` 点击 `R.layout.xxx`,直接打开对应的 XML 文件 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值