精华内容
下载资源
问答
  • androidstudio入门
    千次阅读
    2020-12-14 14:08:14

    Android studio入门到精通实例实验

    实验内容:

    ----------------- 简单的考试程序----------------

    实验步骤:

    一、打开Android studio,新建一个项目;
    在这里插入图片描述
    在这里插入图片描述
    二、写入代码;
    在这里插入图片描述

    <?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">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Android基础知识测评"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.058" />
    
    <EditText
        android:id="@+id/et_on"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:ems="3"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="@+id/textView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/textView"
        app:layout_constraintVertical_bias="0.615"
        android:layout_marginLeft="16dp" />
    
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/di1ti"
        app:layout_constraintStart_toEndOf="@+id/et_on"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />
    
    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/di2ti"
        app:layout_constraintStart_toStartOf="@+id/et_on"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
    
    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="113dp"
        android:layout_height="64dp"
        app:layout_constraintStart_toStartOf="@+id/textView3"
        app:layout_constraintTop_toBottomOf="@+id/textView3">
    
        <RadioButton
            android:id="@+id/rd1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开源的" />
    
        <RadioButton
            android:id="@+id/rd2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="非开源的" />
    </RadioGroup>
    
    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/di3ti"
        app:layout_constraintStart_toStartOf="@+id/textView3"
        app:layout_constraintTop_toBottomOf="@+id/radioGroup" />
    
    <CheckBox
        android:id="@+id/cb2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="60dp"
        android:text="JAVA"
        app:layout_constraintStart_toEndOf="@+id/cb1"
        app:layout_constraintTop_toBottomOf="@+id/textView4"
        android:layout_marginLeft="60dp" />
    
    <CheckBox
        android:id="@+id/cb1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="JDK"
        app:layout_constraintStart_toStartOf="@+id/textView4"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />
    
    <CheckBox
        android:id="@+id/cb3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="60dp"
        android:text="SDK"
        app:layout_constraintStart_toEndOf="@+id/cb2"
        app:layout_constraintTop_toBottomOf="@+id/textView4"
        android:layout_marginLeft="60dp" />
    
    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/di4ti"
        app:layout_constraintStart_toStartOf="@+id/textView4"
        app:layout_constraintTop_toBottomOf="@+id/cb1" />
    
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="130dp"
        android:layout_height="30dp"
        android:entries="@array/Systems"
        app:layout_constraintStart_toStartOf="@+id/textView5"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />
    
    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="104dp"
        android:layout_marginBottom="36dp"
        android:text="总分:"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginLeft="104dp" />
    
    <TextView
        android:id="@+id/sorce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#F1ED06"
        android:text="   00   "
        app:layout_constraintBottom_toBottomOf="@+id/textView6"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.025"
        app:layout_constraintStart_toEndOf="@+id/textView6"
        app:layout_constraintTop_toTopOf="@+id/textView6"
        app:layout_constraintVertical_bias="0.0" />
    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:text="@string/subscribe"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    

    </androidx.constraintlayout.widget.ConstraintLayout>
    在这里插入图片描述
    package com.example.a37;

    import androidx.appcompat.app.AppCompatActivity;

    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.CompoundButton;

    public class MainActivity extends AppCompatActivity {
    static int i = 0,cb_num = 0;
    boolean rd_num = false,sp_num = false,et_num = false;
    TextView sorce;
    TextView et_on;
    RadioGroup rd;
    Button button;
    CheckBox checkBox1;
    CheckBox checkBox2;
    CheckBox checkBox3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //定义
        et_on = findViewById(R.id.et_on);
        sorce = findViewById(R.id.sorce);
        rd = findViewById(R.id.radioGroup);
        button = findViewById(R.id.button);
        checkBox1 = findViewById(R.id.cb1);
        checkBox2 = findViewById(R.id.cb2);
        checkBox3 = findViewById(R.id.cb3);
    
        //为每个复选按钮设置状态改变监听器
        checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked) cb_num++;
                else cb_num--;
            }
        });
        checkBox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked) cb_num--;
                else cb_num++;
            }
        });
        checkBox3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked) cb_num++;
                else cb_num--;
            }
        });
    
        //设置单选按钮组添加事件监听
        rd.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                //获取被选择的单选按钮
                RadioButton r = (RadioButton) findViewById(checkedId);
                if(r.getText().equals("开源的")) rd_num = true;
                else rd_num = false;
            }
        });
    
        //edittext监听
        et_on.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                if(et_on.getText().toString().equals("2")) et_num = true;
                else et_num = false;
                return false;
            }
        });
    
        //获取下拉列表对象
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        //为Spinner添加选择监听器
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            //数据选择事件处理
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                String[] Systems = getResources().getStringArray(R.array.Systems);
                //显示选择结果
                if(Systems[pos].equals("Linux")) sp_num = true;
                else sp_num = false;
            }
            //以下方法重写必须有
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // Another interface callback
            }
        });
    
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(cb_num == 2) i++;
                if(sp_num) i++;
                if(et_num) i++;
                if(rd_num) i++;
                sorce.setText("   "+(i*50)+"   ");
                if(i == 4)
                    Toast.makeText(MainActivity.this,"你真棒!祝贺你!", Toast.LENGTH_SHORT).show();
                else if(i == 2)
                    Toast.makeText(MainActivity.this,"成绩合格!", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(MainActivity.this,"成绩不合格!", Toast.LENGTH_SHORT).show();
            }
        });
    }
    

    }
    在这里插入图片描述

    <string name="app_name" translatable="false">zuoye06_231</string>
    <string name="di1ti" translatable="false">选择题</string>
    <string name="di2ti" translatable="false">Android操作系统是(50分)</string>
    <string name="di3ti" translatable="false">Android Studio 开发Android程序,还需安装:(    )(50分)</string>
    
    <string name="subscribe" translatable="false">提交</string>
    <string name="di4ti" translatable="false">" "</string>
    

    三、运行结果截图:
    1、(打开程序界面)
    在这里插入图片描述
    2、(回答错误界面)
    在这里插入图片描述
    3、(通过考试界面)
    在这里插入图片描述
    到此本次实验完成!

    更多相关内容
  • Android Studio入门教程(新手必看)

    万次阅读 多人点赞 2020-10-07 15:26:39
    上篇文章已经说过了Android Studio的安装配置,从这里开始我们就来完成第一个Android项目吧! 如何安装配置还不太熟悉的可以参考这篇文章:Android Studio安装配置详细步骤(超详细)   让我们开始第一个Android...

    上篇文章已经说过了Android Studio的安装配置,从这里开始我们就来完成第一个Android项目吧!
    如何安装配置还不太熟悉的可以参考这篇文章:Android Studio安装配置详细步骤(超详细)

    让我们开始第一个Android项目吧

    1.建立项目

    在这里插入图片描述

    选一个Empty Activity,然后Next

    在这里插入图片描述

    默认即可,点击 Finish

    Name:文件名
    Save location:文件的保存位置
    Language:默认Java,会用Kotlin的也可以更改
    API level:默认即可,级别低运行的快些

    在这里插入图片描述

    等待这个zip文件下载完,可能比较慢耐心等待

    在这里插入图片描述

    这样就代表成功了

    在这里插入图片描述

    如果时间比较久了还是这样,或者提示失败了,就请参考这篇博文:Android Studio一直停留在MyApplication:syncing(解决方案)

    如果上一步成功了,我们此时应该先点开3的位置,1的位置上可能还没显示,运行后就显示了

    在这里插入图片描述

    点开位置3后,选择 “Create Virtual Device”

    在这里插入图片描述

    点击 Next

    在这里插入图片描述

    在这行的位置上 点击蓝色的 Download,因为我下载过了所以不显示了

    在这里插入图片描述

    然后同意协议 Accept,然后 Next

    在这里插入图片描述

    出现下载界面,等待即可,然后点击Finish

    在这里插入图片描述

    继续 Next

    在这里插入图片描述

    点击Finish

    在这里插入图片描述

    把这个弹出的窗口关闭即可

    在这里插入图片描述

    在2的位置上,选上刚才下载的那个

    在这里插入图片描述

    然后点击 运行按钮,稍等一下下,不是很快

    在这里插入图片描述

    如果没有出现1位置这样全是对号而是下面的报错情况

    在这里插入图片描述
    报错提示:
    Emulator: Process finished with exit code 1
    Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

    请看这篇博文:Android Studio 报错Emulator: Process finished with exit code 1
    Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT(解决方法)

    然后是这样,关闭这个弹窗,然后可能还要等一下下

    在这里插入图片描述

    出现这个界面即成功了,恭喜你完成了第一个Android 项目

    在这里插入图片描述

    写作不易,看完如果对你有帮助,点个赞,支持一下!
    在这里插入图片描述

    加油!

    共同努力!

    Keafmd

    展开全文
  • Android Studio入门视频

    2016-03-02 20:29:42
    Android Studio 入门视频 由于压缩包太大,所以就给了百度云连接
  • Android studio入门详解

    千次阅读 多人点赞 2021-10-11 15:19:13
    1.如何查看Android studio的环境搭建是否成功 首先在Android studio中的sdk manager查看sdk存放位置,如何打开,同时按shirt+ctrl+鼠标右键,如下图: 然后点击“在此处打开power shell窗口”,...

    1.如何查看Android studio的环境搭建是否成功

       首先在Android studio中的sdk manager查看sdk存放位置,如何打开,同时按shirt+ctrl+鼠标右键,如下图:

            然后点击“在此处打开power shell窗口”,便得到下图:

     

    输入cmd,进入该文件夹的命令提示符,再输入adb shell,如上图显示不报错即安装成功。以上为环境搭建成功检测。

    2.新建项目与运行

       点击file→new→New Protect,如下图,然后点击Basic Activity,一直点击next,

     

    新建项目后,在运行前需要配置模拟机供其运行项目(一般配置一次模拟机可以运行所有项目),否则没有载体,配置模拟机步骤如下:

         点击右上角的AVD manager按钮然后点击下图的左下角处Create Virtual,

     

     

     

    然后一直点击next,最后模拟机创建成功。模拟机创建成功之后便是运行。

    最基本的运行操作有两种,一为run→Run app;二为直接点击右上角绿色三角形按钮

     

    便会出现模拟机,显示内容(如下图)

     

     

    运行完毕。

    3.修改项目内容

      由上图可知,这为一个简单的app,仅有text view。下面就来讲解如何修改text view内容。首先点击res→fragment_first.xml,如下图:

     

    然后在右边视角便可以查看该内容,接着修改text view显示有两种方法,右边视图如下:

     

    在右边有三个选项,code对应代码,design对应图形(即显示的结果),split包含以上两者。

     

    方法一:点击code,找到代码中的textview栏,然后找到Android:text=“里面即为显示在模拟机的textview内容。”

    方法二:直接修改textview内容

     

    二:文件夹及代码详解

    如下图从Android模式更改成Procjct模式

     

    现在来解析外层目录每一个文件夹以及每一个文件:

     

    1..gradle文件与.idea文件

         这两个文件夹放置的都是Android studio自动生成的文件。

    2.gradle文件夹

           Gradle是独立于Android studio运行的,这个文件夹里包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,会根据本地的缓存情况决定是否需要联网下载。Android studio默认没有启用gradle wrapper的方式,如果需要打开,可以点击Android studio导航栏→File→Settings→Build,Execution,Deployment→Gradle,进行配置更改。Gradle是一种构建脚本,用Groovy语言实现,一种类似于java的语言,Gradle可以自动化构建、测试、发布、部署以及更多的软件包或者其他类型的项目,如生成的静态网站、生成的文档或其他任何东西。

    3..gitignore文件

    这个文件是用来将指定的文件或目录排除在版本之外的

    4.build。gradle和settings.gradle文件

    build.gradle是项目全局的 构建对象,对应Project对象,而settings.gradle用于指定项目中引入的模块,对应Setting对象。一个AS工程构建的整个过程如下:构建开始时首先会创建一个Setting对象,根据settings.gradle的内容来配置这个Setting对象,通过这个Setting对象来加载Project,include多少个Moudle就会创建多少个Project,根据build.gradle内容配置Project对象。build.gradle一般不需要修改,settings.gradle主要用于加载配置,里面有个”app”,如果改了模块名字,则必须在settings.gradle中声明。

    5.gradle.properties

         这个是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的graddle编译脚本。

    6.gradlew和gradlew.bat

         这两个文件是用来命令行界面中执行graddle命令的,其中gradlew是在Linux或mac系统的,gradlew.bet是window系统中使用的。

    7.local.properties

         这个文件用于本机中的Android SDK路径,通常内容都是自动生成的,不需要修改,当本机中的SDK位置发生了变化,就将这个文件的路径改成性的位置即可。

    三.app文件

     

    1.build文件

         系统生成的文件目录,最后生成的apk文件(apk-debug.apk)就在该文件的outputs文件里,里面会有相关文件的大小占比,如下:

     

    2.lib文件

    第三方jar包的存放地址,还有so包,如果项目中使用了第三方jar包,需放在这个目录里,放在这个目录的jar包都会被自动添加到构建路径里去。

    3..gitignore

         这个文件用于将APP板块内的的制定的文件或目录排除在版本之外,作用与外层的.gitignmore相似

    4.build.gradle

    代码如下图:

     

    第一行的id应用了一个插件,一般有两种值可选:com.android.application表示这是一个应用程序模块,com.android.library表示和是一个库模块。应用程序模块和库模块的最大区别在于,一个可以直接运行,一个只能作为代码库依附于别的应用程序模块来运行。

    往下看是一个大的android闭包,在这个闭包中我们可以配置项目构建的各种属性。Compilesdk是指项目的编译版本,下图为各个sdk对应版本

    android闭包里面还有很多小包: 

    defaultConfig可以更细的进行配置,applicationId用于指定项目的包名,在创建时我们已经指定过包名了,如果需要修改,就是在这里修改的。Minsdk用于指定项目最低兼容的Android版本,这里的21由上图可知为Android5.0.。targetsdk指定的值表示你在该目标版本上已经做过充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0 系统中引入了运行时权限这个功能,如果你将targetSdkVersion 指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在 Android 5.1系统上做过充分的测试,Android6.0系统中引人的新功能自然就不会启用了。剩下的两个属性都比较简单,versionCode 用于指定项目的版本号,versionName 用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到。

    buildTypes 闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。另外, debug 闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。下面来看一下release闭包中的具体内容吧,minifyEnabled用于指定是否对项目的代码进行混淆,true表示混淆,false 表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android.txt 是在 Android SDK 目录下的,里面是所有项目通用的混淆规则,第二个 proguard-rules.pro 是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。

    5.proguard-rules.pro

         这个问价可能用于指定项目代码的混淆规则,当代码开发完成后打包安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难于阅读。

    6.src目录

      

     

    Src目录包含着三个文件夹:Androidtest, main ,test

    先来分析一下Android test和test包,这都是一个测试包,androidTest是整合测试,可以运行在设备或虚拟设备上,需要编译打包为APK在设备上运行,可以实时查看细节

    test 是单元测试,运行在本地开发机上,可以脱离Android运行环境,速度快。

    再讲一下main包:

    里面包含着Java和res和AndroidMainfest.xml。

    来说一下AndroidMainfest.xml:

     

    这段代码表示对 HelloWorldActivity这个活动进行注册,没有在AndroidManifest.xml里注册的活动是不能使用的。其中intent-filter里的两行代码非常重要,<action android:name="android.intent.action.MAIN”/>和<category android:name="android.intent.category LAUNCHER"/>表示 HelloWorldActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

    AndroidManifext描述了package中暴露的组件像activity,serveice等,他们各自的实现类,各种能被处理的数据和启动位置。此外还能声明程序中的contentproviers,intentreceivers,还能指定permissions和instrumentation等等。

    xmlns:android:定义android的命名空间。

    package:指定本应用内java主程序的包名,这里就是com.example.jared.hello了。

    application:声明了每一个应用程序的组件及其属性。

    android:icon:显而易见表示APP的图标了。

    android:label:许可列表。

    android:supportsRtl:启用各种RTLAPI来用RTL布局显示应用,这个是android4.2的新特性。     android:theme:android的主题。

    activity:android:name表示当前的activity的名字,因为工程为MainActivity,所以这个名字就为这个,之后有新的activity的话,也需要添加才可以使用。

    intent-filter:包含了action和 category两种。

    action:只有android:name属性,常见的是android.intent.action.MAIN,表示此activity是作为应用程序的入口。 

    category:android:name属性,常见的是android.intent.category.LAUNCHER,决定应用程序是否显示在程序列表里。

    再说一下java

     

    由上图可知,有两个fragment,分别是first和second。那么fragment有什么用呢?

    Fragment是Android 3.0 (Honeycomb)被引入的。主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机的屏幕大很多,因此可用于组合和交换的UI组件的空间更大,利用Fragment实现此类设计的时,就无需管理对视图层次结构的复杂更改。通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。如果仅仅只有Activity布局,那是不够的,不仅在手机上有一套布局,同时在平板上还需要设计一套布局,那样维护起来也麻烦,代码上也有一定的冗余,对于APP包的大小也有一定的压力。Fragment的优势是布局在不同设备上的适配。

    使用Fragment还有这么几个方面优势:

    代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。

    Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。

    可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。

    Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。、

     

    这个是函数重写

     

    再来说一下mainActivity:

     

    由这段代码可以看出,首先Mainactivity继承了AppCompatActivity。

    然后再看下onCreate方法,这个是android的一个设计模式ioc,android的架构基本上就是用了这个模式。用户看不到onCreate之前干了什么,只要完成这个函数,并且在里面调用需要调用的东西即可。super.onCreate方法是调用父类的onCreate方法,然后setContentView方法就是为当前的activity引入了一个activity_main的布局。

    在此附上查阅资料但与新版代码不一样的解析:

    代码如下

    package jay.com.example.firstapp;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    public class MainActivity extends AppCompatActivity {

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

        }

    }

     

    最后再来讲一下res文件夹:

     

    drawable:存储一些xml文件,-*dpi表示存储分辨率的图片,用于适配不同的屏幕。

     

    主要记录这些背景的参数

    Fillcolor是填充颜色

    Pathdate是路径数据

    Strokewidth是笔划宽度

    Strokecolor是笔划颜色

    Drawable-v24为前景目录

     

    Width是宽度

    height是高度

    viewportwidth是窗口宽度

    viewportheight是窗口高度

    startX/Y,endX/Y是窗口的定位,x、y的开始结束坐标

    type是类型(linear是线性布局)

    offset是偏移量

    filltype是填充类型

    剩下的和上面的一样

    以下是对该文件里面的一些后缀的解释(分辨率)

    -mdpi:320x480

    -hdpi:480x800、480x854

    -xhdpi:至少960x720

    -xxhdpi:1280x720

    layout:存储布局文件

    mipmap:存储原声图片资源

    values:存储app引用的一些值

    - colors.xml:  存储了一些color的样式

    - dimens.xml:存储了一些公用的dp值                      

    - strings.xml: 存储了引用的string值

    - styles.xml:   存储了app需要用到的一些样式

     

    还有上图几个文件夹

    Nav_graph.xml为碎片导航布局文件

    Colors.xml为色彩编辑文件

    Dimens.xml为尺寸编辑文件

    Strings.xml为字符文件

    Themes.xml为作主题文件

    然后land、night、w600dp、w1240dp中的每个xml文件中的dp值斗鱼values目录里面的不一样

    然后我们再来详细说一下layout里面的文件:

     

    Fragment first和second类似:

     

    RelativeLayout:相对布局。

    xmlns:android定义:android命名空间。

    xmlns:tools:tools命名空间,用来预览一些布局属性的添加喝删除后的效果。

    android:layout_width:指定了控件的宽度,可选择match_parent,fill_parent,wrap_content,其中match_parent和fill_parent的意思相同,官方更加推荐使用match_parent。match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。wrap_content表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。

    android:layout_height:同上。

    Tools:context为工具背景

    TextView:android的控件。

    android:text:textview显示的内容,这里就是hello world了。

    layout constraint Bottom toTop Of:这个为布局约束从下到上

    layout constraint End toEnd Of:这个为布局约束端到端

    layout_constraintStart_toStartOf:这个为布局约束从开始到开始

    layout_constraintTop_toTopOf:这个为布局约束从点到点

    <button>为按钮的意思,即为app运行是中间的按钮

    解析同上

    然后是activity­_main.xml:

    大致与上面xml文件类似:

     

    RelativeLayout:相对布局。

    xmlns:android定义:android命名空间。

    xmlns:tools:tools命名空间,用来预览一些布局属性的添加喝删除后的效果。

    android:layout_width:指定了控件的宽度,可选择match_parent,fill_parent,wrap_content,其中match_parent和fill_parent的意思相同,官方更加推荐使用match_parent。match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。wrap_content表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。

    android:layout_height:同上。

    android:paddingLeft,android:paddingRight,android:paddingTop,android:paddingBottom:站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离。此外还有margin,它是站在自己的角度描述问题,规定自己喝其他的view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。

     

    Content.main.xml基本部分也和上面三个xml文件一样,就不一一具体说明了

    多了几个部分

    app:navGraph:为导航图部分

    defaultNavHost:为你默认的导航主机

    layout_behavior:为布局行为

    以上内容为Android studio的解析

    展开全文
  • AndroidStudio教程从入门到精通.[汇编].pdf
  • Android Studio入门到精通资料.txt
  • Android Studio入门教程(计算器)

    千次阅读 2022-05-11 20:51:55
    Android Studio 是Google开发的一款面向Android开发者的IDE,支持Windows、Mac、Linux等操作系统,基于流行的开发语言java集成开发环境IntelliJ搭建而成的,类似Eclipse ADT。该IDE在2003年5月的Google I/O开发者...

    一、建立开发环境

    1、AS简介

    Android Studio 是Google开发的一款面向Android开发者的IDE,支持Windows、Mac、Linux等操作系统,基于流行的开发语言java集成开发环境IntelliJ搭建而成的,类似Eclipse ADT。该IDE在2003年5月的Google I/O开发者大会首次露面,当时的测试版本还不够完善,直到2014年12月8日发布了稳定的版本。Android Studio 提供了集成的 Android 开发工具用于开发和调试。
    1)基于 Gradle 的灵活构建系统
    2)快速且功能丰富的模拟器
    3)可针对所有 Android 设备进行开发的统一环境
    4)Instant Run,可将变更推送到正在运行的应用,无需构建新的 APK
    5)可帮助您构建常用应用功能和导入示例代码的代码模板和 GitHub 集成
    6)丰富的测试工具和框架
    7)可捕捉性能、易用性、版本兼容性以及其他问题的 Lint 工具
    8)C++ 和 NDK 支持
    9)内置对 Google 云端平台的支持,可轻松集成 Google Cloud Messaging 和 App 引擎

    2、环境的搭建

    可参考:https://blog.csdn.net/u014720022/article/details/93320488
    系统要求:Win7或更高、内存 最少 4 GB ,建议8 GB RAM、硬盘 4G
    1)下载JDK
    官网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    2)下载AS
    官方下载地址:https://developer.android.google.cn/studio/
    3)安装JDK及Java环境
    4)安装Android Studio
    5)搭建环境所碰到的坑
    安装Android Studio时,无法安装Android Studio的SDK组件
    在这里插入图片描述
    这个问题特别折磨人,经过多次排查和反复安装后发现主要是网络问题导致的,安装前需要关掉防火墙。关掉防火墙后,必须把之前安装的Android Studio卸载掉,再重新进行安装才生效。

    3、开发步骤

    在这里插入图片描述

    二、开发教程-计算器

    1、概述

    一个简单的Android App开发,这个App是个简单的计算器,支持简单的加减乘除的运算

    2、创建应用

    1)双击,启动Android Studio
    2)创建项目,选择New Project
    在这里插入图片描述
    如果是已有的项目,在列表中存在时就直接选择,不存在时点击Open选中对应的文件夹
    3)选择想要创建的Android版本
    建议选择empty activity(空模板),然后点击next
    在这里插入图片描述
    4)填写项目信息
    本项目主要使用的开发语言是JAVA。其中,Minimum SDK版本是Andriod虚拟机运行的版本,版本越低运行越快,根据个人要求来选择(我这边是直接选择默认的),然后点击finish
    在这里插入图片描述

    3、项目结构

    新手开发,建议还是熟悉下项目的整体结构,更有利于整体的开发。
    可参考:https://blog.csdn.net/weixin_43899065/article/details/124727916

    4、熟悉Android Studio

    在这里插入图片描述
    1:导航栏可帮助我们在项目中导航,以及打开文件进行编辑。此区域提供 Project 窗口所示结构的精简视图。
    2:工具栏提供执行各种操作的工具,包括运行应用和启动 Android 工具。
    3:工具窗口栏在 IDE 窗口外部运行,并且包含可用于展开或折叠各个工具窗口的按钮。
    4:工具窗口提供对特定任务的访问,例如项目管理、搜索和版本控制等。我们可以展开和折叠这些窗口。
    5:编辑器窗口是创建和修改代码的区域。 编辑器可能因当前文件类型的不同而有所差异。 例如,在查看布局文件时,编辑器显示布局编辑器。
    6:状态栏显示项目和 IDE 本身的状态以及任何警告或消息。

    5、设置手机模拟机(需联网下载)

    1)点击模拟机设置图标,右边弹窗出来选择Virtual,之后点击Create device
    在这里插入图片描述
    2)点击Phone,选择想要的手机类型,点击next
    在这里插入图片描述
    3)选择对应的类型,点击next
    在这里插入图片描述
    4)给该模拟机命名,点击finish,就会开始下载该模拟机

    5)测试模拟机是否下载成功
    在这里插入图片描述
    6)调试默认模板的项目,看是否成功。失败的话,可以进入Build看报错原因
    在这里插入图片描述

    6、开始进入编写项目

    写代码的过程中,记得写完一个模块就调试下,看有没有出现bug,及时解决

    该项目是个简单的计算器的应用,没有页面间的交互,所以主要的围绕以下的三个文件:
    MainActivity.java:提供了用户与屏幕之间的互动,以便于用户进行操作,在里面实现主要的Java代码
    activity_main.xml:布局文件,Android的UI界面显示的视图,所有的控件在这里设计
    AndroidManifest.xml:Android应用程序的清单文件,是整个Android应用程序的描述文件
    在这里插入图片描述
    1)activity_main.xml

    • 先将android.support.constraint.ConstraintLayout改为LinerLayout线性的,意思就是水平的的结构
    • 并加入android:orientation="vertical"意思是将所有组件垂直摆放
    • 设置背景色为黑色
    <LinearLayout 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"
        android:orientation="vertical"
        tools:context=".MainActivity"
        android:background="#000000" >
    </LinearLayout>
    
    • 设置数字显示框的样式
    <EditText
            android:id="@+id/et_input"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@drawable/white"
            android:clickable="false"
            android:editable="false"
            android:paddingBottom="5dp"
            android:textSize="32sp" />
    
    • 结合LinerLayout线性的布局方式,设置各个按钮样式,以下列举两个按钮,其他按钮也是类型此布局
    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:orientation="horizontal"
            android:gravity="center_horizontal"
            >
            <Button
                android:id="@+id/btn_clr"
                android:layout_width="170dp"
                android:layout_height="70dp"
                android:text="C"
                android:textSize="30sp"
                android:paddingRight="15sp"
                android:paddingBottom="15sp"
                android:background="@drawable/selector"/>
            <Button
                android:id="@+id/btn_del"
                android:layout_width="170dp"
                android:layout_height="70dp"
                android:text=""
                android:textSize="30sp"
                android:layout_marginLeft="10dp"
                android:paddingRight="15sp"
                android:paddingBottom="15sp"
                android:background="@drawable/selector"/>
        </LinearLayout>
    
    • 上面的android:id="@+id/btn_del"是为了在MainActivity.java可以准确获取到各个布局的id,便于整个业务交互逻辑的操作
    • 上面的android:background是自定义了该布局的样式,主要在drawable文件里创建文件并自己画出样式后,再直接引用,这边便不细说了。

    2)MainActivity.java

    • 先获取到各个按钮,再进行点击事件监听
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        //创建Button对象   也就是activity_main.xml里所设置的ID
        Button btn_0,btn_1,btn_2,btn_3,btn_4,btn_5,btn_6,btn_7,btn_8,btn_9,btn_pt;
        Button btn_mul,btn_div,btn_add,btn_sub;
        Button btn_clr,btn_del,btn_eq;
        Button btn_left,btn_right;
        EditText et_input;
        Boolean resErr = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //实例化对象
            setContentView(R.layout.activity_main);
            btn_0= (Button) findViewById(R.id.btn_0);
            btn_1= (Button) findViewById(R.id.btn_1);
            btn_2= (Button) findViewById(R.id.btn_2);
            btn_3= (Button) findViewById(R.id.btn_3);
            btn_4= (Button) findViewById(R.id.btn_4);
            btn_5= (Button) findViewById(R.id.btn_5);
            btn_6= (Button) findViewById(R.id.btn_6);
            btn_7= (Button) findViewById(R.id.btn_7);
            btn_8= (Button) findViewById(R.id.btn_8);
            btn_9= (Button) findViewById(R.id.btn_9);
            btn_pt= (Button) findViewById(R.id.btn_pt);
            btn_add= (Button) findViewById(R.id.btn_add);
            btn_sub= (Button) findViewById(R.id.btn_sub);
            btn_mul= (Button) findViewById(R.id.btn_mul);
            btn_div= (Button) findViewById(R.id.btn_div);
            btn_clr= (Button) findViewById(R.id.btn_clr);
            btn_del= (Button) findViewById(R.id.btn_del);
            btn_eq= (Button) findViewById(R.id.btn_eq);
            et_input= (EditText) findViewById(R.id.et_input);
            btn_left= (Button) findViewById(R.id.btn_left);
            btn_right= (Button) findViewById(R.id.btn_right);
    
            //给按钮设置的点击事件
            btn_0.setOnClickListener(this);
            btn_1.setOnClickListener(this);
            btn_2.setOnClickListener(this);
            btn_3.setOnClickListener(this);
            btn_4.setOnClickListener(this);
            btn_5.setOnClickListener(this);
            btn_6.setOnClickListener(this);
            btn_7.setOnClickListener(this);
            btn_8.setOnClickListener(this);
            btn_9.setOnClickListener(this);
            btn_pt.setOnClickListener(this);
            btn_add.setOnClickListener(this);
            btn_sub.setOnClickListener(this);
            btn_mul.setOnClickListener(this);
            btn_div.setOnClickListener(this);
            btn_clr.setOnClickListener(this);
            btn_del.setOnClickListener(this);
            btn_eq.setOnClickListener(this);
            btn_left.setOnClickListener(this);
            btn_right.setOnClickListener(this);
        }
    }
    
    • 之后开始进入编写点击事件
      左括号:1、若已有输入且前一位不是运算符号,则默认在左括号前面加✖
      右括号:1、等式必须存在左括号才允许输入;2、若前一位是小数点,则默认在右括号前面加0
      加减乘除运算符号:1、前一位必须不是运算符号才允许输入;2、若前一位是小数点,则默认在运算符号前面加0
      小数点:1、若在当前输入的位置至前一个运算符号这一串字符串,存在小数点的话,则不允许输入小数点(例如:1.12 - 1 + 2.11);2、若前一位是运算符号或左括号或未输入字符时,默认在小数点前面补0
        @Override
        public void onClick(View v) {
            if(resErr) {
                et_input.setText("");
                resErr = false;
            }
            String str=et_input.getText().toString();
            switch (v.getId()){
                case   R.id.btn_0:
                case   R.id.btn_1:
                case   R.id.btn_2:
                case   R.id.btn_3:
                case   R.id.btn_4:
                case   R.id.btn_5:
                case   R.id.btn_6:
                case   R.id.btn_7:
                case   R.id.btn_8:
                case   R.id.btn_9:
                    et_input.setText(str+((Button)v).getText());
                    break;
                case   R.id.btn_left:
                    if(!str.equals("") && !lastOperation(str, null)) {
                        str = str + " × ";
                    }
                    et_input.setText(str+((Button)v).getText());
                    break;
                case   R.id.btn_right:
                    if (str.indexOf("(") != -1) {
                        if (lastOperation(str, "point")) {
                            str = str + "0";
                        }
                        et_input.setText(str+((Button)v).getText());
                    }
                    break;
                case R.id.btn_add:
                case R.id.btn_sub:
                case R.id.btn_mul:
                case R.id.btn_div:
                    if (lastOperation(str, "point")) {
                        str = str + "0";
                    }
                    if(!lastOperation(str, null)) {
                        et_input.setText(str+" "+((Button)v).getText()+" ");
                    }
                    break;
                case   R.id.btn_pt:
                    if (!hasPoint(str)) {
                        if (lastOperation(str, null) || lastOperation(str, "left")  || str.equals("")) {
                            str = str + "0";
                        }
                        et_input.setText(str+((Button)v).getText());
                    }
                    break;
                case R.id.btn_clr:
                    et_input.setText("");
                    break;
                case R.id.btn_del: //判断是否为空,然后在进行删除
                    if(str != null && !str.equals("")){
                        et_input.setText(str.substring(0, str.length() - 1));
                    }
                    break;
                case R.id.btn_eq: //单独运算最后结果
                    getResult();//调用下面的方法
                    break;
            }
        }
        
        // 判断首位是否为运算符号、小数点
        private static Boolean firstOperation(String str, String type) {
            String newStr = str.trim();
            if (newStr.equals("")) return false;
            char firstChar = newStr.charAt(0);
            if (type == "point") {
                return firstChar == '.';
            } else if(type == "left"){
                return firstChar == '(';
            }else if(type == "right"){
                return firstChar == ')';
            } else {
                return firstChar == '+' || firstChar == '-' || firstChar == '×' || firstChar == '÷';
            }
    
        }
    
        // 判断末位是否为运算符号、小数点
        private static Boolean lastOperation(String str, String type) {
            String newStr = str.trim();
            if (newStr.equals("")) return false;
            char lastChar = newStr.charAt(newStr.length()-1);
            if (type == "point") {
                return lastChar == '.';
            } else if(type == "left"){
                return lastChar == '(';
            } else if(type == "right"){
                return lastChar == ')';
            } else {
                return lastChar == '+' || lastChar == '-' || lastChar == '×' || lastChar == '÷';
            }
        }
    
        // 判断当前输入到运算符前,是否有小数点
        private static Boolean hasPoint(String str) {
            int index = 0;
            String[] operationArr = {"+", "-", "×", "÷"};
            for(int i = 0; i < operationArr.length; i++) {
                int w = str.lastIndexOf(operationArr[i]);
                if (w > index) index = w;
            }
            String newStr = str.substring(index);
            return newStr.indexOf(".") != -1;
        }
    
    • 点击计算最终结果
      1、左右括号数量不对等,等式有问题
      2、第一位是运算符号时,最前面补0
      3、最后一位是运算符号或小数点时,最后面补0
      4、整体运算逻辑根据进出栈来实现的,共有两个栈:数字numStack 、非数字(运算符号和括号)signalStack 。
      遍历计算公式后,
      数字的话,进栈numStack
      非数字的话,需要先判断其运算等级是否大于signalStack 的最后一位,若大于则进栈signalStack ;而小于的话,numStack 出栈两个数字,signalStack 出栈一个运算符号,计算结果入栈numStack;之后继续判断该非数字的运算等级和signalStack 的最后一位的大小,结果循环上述的,直到其能入栈signalStack
    private void getResult() {
            String exp=et_input.getText().toString();
            if(exp==null||exp.equals("")) return ;
            resErr = false;
            // 判断括号是否正确
            if (getNum(exp, "(") != getNum(exp, ")")) {
                resErr = true;
                et_input.setText("等式有问题!!!");
                return ;
            }
            //因为没有运算符所以不用运算
            if(!exp.contains(" ")){
                return ;
            }
            if (firstOperation(exp, null)) {
                exp = "0 " + exp;
            }
            if(lastOperation(exp, null) || lastOperation(exp, "point")) {
                exp = exp + "0 ";
            }
    
            Stack<Double> numStack = new Stack<>();
            Stack<Character> signalStack = new Stack<>();
            int index = 0;// 记录已经执行的符号数
            int len = exp.length();
            while (index < len) {
                char c = exp.charAt(index); // 取出这一步的符号
                if (c == '(') {
                    signalStack.push(c);// 若是左括号就进栈
                }
                // 否则要先判断优先级
                else if (c == '+' || c == '-' || c == '×' || c == '÷') {
                    int currOperLevel = getOperlevel(c);// 当前符号的优先级
                    while (true) {
                        int stackOperLevel = 0;// 栈顶元素的优先级
                        if (!signalStack.isEmpty()) {
                            Object obj = signalStack.peek();
                            stackOperLevel = getOperlevel((char) obj);
                        }
                        // 若当前元素优先级大于栈顶元素的优先级则入栈
                        if (currOperLevel > stackOperLevel) {
                            signalStack.push(c);
                            break;// 直到让比自己优先级高的符号都出栈运算了再把自己进栈
                        } else {// 不能入栈就进行计算
                            try {
                                char optemp = '0';
                                double num1 = 0;
                                double num2 = 0;
                                if (!signalStack.isEmpty()) {
                                    optemp = (char) signalStack.pop();// 取出优先级大的那个符号
                                }
                                if (!numStack.isEmpty()) {
                                    num1 = (double) numStack.pop();
                                    num2 = (double) numStack.pop();// 取出数据栈中的两个数
                                }
                                numStack.push(caculateResult(optemp, num2, num1));// 将算出来的结果数据再次进入数据栈
                            } catch (Exception e) {
                                // TODO: handle exception
                                e.printStackTrace();
                            }
                        }
                    }
                } else if (c == ')') {// 右括号就返回栈顶元素,右括号是不进栈的
                    while (true) {
                        char theop = (char) signalStack.pop();
                        if (theop == '(') {
                            break;
                        } else {
                            try {
                                double num1 = (double) numStack.pop();
                                double num2 = (double) numStack.pop();
                                numStack.push(caculateResult(theop, num2, num1));// 运算括号内的内容
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } else if (c >= '0' && c <= '9') {
                    int tempIndex = index + 1;
                    while (tempIndex < len) {
                        char temp = exp.charAt(tempIndex);// 取字符串中处于当前字符的下一位
                        if ((temp >= '0' && temp <= '9') || temp == '.') {
                            tempIndex++;// 若为数字则继续向后取
                        } else {
                            break;// 证明数字去完
                        }
                    }
                    String numstr = exp.substring(index, tempIndex);// 截取这个字符串则为两个符号之间的数字
                    try {
                        double numnum = Double.parseDouble(numstr);// 将数字转换成整型便于运算
                        numStack.push(numnum);
                        index = tempIndex - 1;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                index++;
            }
    
            // 检查符号栈是否为空
            while (true) {
                Object obj = null;
                if (signalStack.isEmpty() == false) {
                    obj = signalStack.pop();
                }
                if (obj == null) {
                    break;// 为空证明运算已结束
                } else {// 不为空就出栈运算
                    char opterTemp = (char) obj;
                    double num1 = (double) numStack.pop();
                    double num2 = (double) numStack.pop();
                    numStack.push(caculateResult(opterTemp, num2, num1));
                }
            }
            double result = (double) numStack.pop();
            et_input.setText(result + "");
        }
        
        private static int getNum(String originStr, String targetStr){
            int res = 0;
            int i = originStr.indexOf(targetStr);
            while (i != -1){
                i = originStr.indexOf(targetStr,i+1);
                res++;
            }
            return res;
        }
        
        //计算加减乘除余
        private static Double caculateResult(char optemp, double num1, double num2) {
    
            switch (optemp) {
                case '+':
                    return num1 + num2;
                case '-':
                    return num1 - num2;
                case '×':
                    return num1 * num2;
                case '÷':
                    return num1 / num2;
            }
            return 0.0;
        }
    
        //返回符号优先级
        private static int getOperlevel(char c) {
    
            switch (c) {
                case '+':
                case '-':
                    return 1;
                case '×':
                case '÷':
                    return 2;
                default:
                    return 0;
            }
        }
    

    3)AndroidManifest.xml

    • android:icon设置app图标
    • android:label设置app名称
    <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@drawable/icons2"
            android:label="@string/app_name"
            android:roundIcon="@drawable/ic_launcher_background"
            android:supportsRtl="true"
            android:theme="@style/Theme.Calculator"
            tools:targetApi="31">
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    

    7、发布打包项目为apk

    • 菜单栏 -> Build -> Generate Signed APK
      在这里插入图片描述
    • 选择APK后,点击Next
      在这里插入图片描述
    • 点击create new,创建一个密钥库
      在这里插入图片描述
    • 填写密钥库后,选择OK
      在这里插入图片描述
    • 填写密钥库的别名,密码,确认密码,点击next
      -在这里插入图片描述
    • 路径这边是直接默认,选择release后,点击finish
      在这里插入图片描述
    • build没有报错,且有弹出打包成功的弹框说明打包成功
      在这里插入图片描述
    • 可在该文件夹下,看到打包成功的apk文件
      在这里插入图片描述
    展开全文
  • 1 android studio安装过程 2 android studio开始开发(第1个程序) 3 androidstudio使用经验Q&A
  • Android Studio入门之真机调试

    千次阅读 2021-07-27 10:05:03
    Android Studio做出的应用放在真机测试其实可以更好的看出我们的应用的缺陷。然后很多小伙伴可能就是对如何启动真机调试还是一脸懵逼。现在我演示一种百分百能成功连接真机的方法。 1.打开我们的SDK Manager,点击...
  • 一、实现效果 ...  二、编码思路 三、代码展示 //MainActivity ... //import androidx.appcompat.app.AppCompatActivity;...//import androidx.fragment.app.Fragment;...//import androidx....import android.app.Activit
  • Android Studio入门级教程(详细)【小白必看】

    万次阅读 多人点赞 2020-03-24 10:15:04
    Android Studio如何使用 之前的文章已经讲解了Android Studio的安装和配置过程 请参考: 本文主要讲解一下Android Studio使用方法 步骤: 1.建立项目 首先点击new——new project新建项目 选择想要创建的...
  • Android Studio入门到精通(清晰版) ,非常适合初学者看,虽然Android studio 不是最新的版本,但是里面的操作版面基本差不多,建议初学者下来看看。
  • 教程名称: 尚硅谷公开课15季-Android Studio入门及使用技巧 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • Android studio入门问题

    2019-11-23 23:42:28
    ![图片说明](https://img-ask.csdn.net/upload/201911/23/1574523645_749802.png) XML界面代码全部标红,preview也一直在loading
  • Android Studio 入门视频

    2016-02-27 10:46:35
    介绍Android Studio 的基本知识及使用方法
  • Android Studio入门指南

    千次下载 热门讨论 2013-11-06 09:00:08
    历上最全,全球首本Android Studio入门指南,如有任何问题,请联系我. 博客:blog.csdn.net/wirelessqa 来往:hello_xiaopeng 如果没有分,留下邮箱,我可以直接把书发给你。哈哈!
  • Android Studio入门指南v0.1》,太老了,但是总结的还可以。。。。。
  • droidfest-todolist 一个简单的应用程序,在我在浦那 DroidFest 上的演讲“Android Studio 入门”中演示了 Android Studio 的功能。
  • 上篇文章介绍了AS的一些常用设置方法,当工具调教妥当后... java目录会默认生成三个文件夹,其中test为在本机执行单元测试代码的目录, androidTest为在Android设备上执行单元测试代码的目录,第一个不带后缀的目录就是
  • Androidstudio入门指南

    2016-08-18 11:28:36
  • android studio 入门比较好的书籍

    万次阅读 2017-08-11 16:06:21
    http://blog.csdn.net/aqi00/article/details/50012511 http://blog.csdn.net/aqi00/article/details/73065392
  • Android Studio入门到精通

    万次阅读 多人点赞 2015-04-27 09:59:21
    目标:Android Studio新手–>下载安装配置–>零基础入门–>基本使用–>调试技能–>构建项目基础–>使用AS应对常规应用开发AS简介经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境Android ...
  • Android Studio 入门整理

    千次阅读 2015-08-09 15:52:08
    转载至 http://stormzhang.com/posts.html#AndroidStudio 下载与安装 背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源...
  • Android studio 入门第一个APP

    千次阅读 2020-11-20 20:16:05
    Android开发第一个app
  • Android studio 教程入门

    2021-08-05 20:03:33
    其中的open是打开一个Android项目 2.输入项目的名称test ,此项目放在E盘下,然后点击Finish 3.选择Android 虚拟机的版本,版本越低运行起来越快,其他的无需勾选。 4.选择Android 的模板,选择基础类...
  • Android Studio入门小例子 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=...
  • Android Studio入门学习(1)

    千次阅读 2021-11-25 19:18:49
    一、Android Studio下载安装 就不演示了 二、新建一个项目 在这里可以随便选择一个模板进行创建 给我的项目取一个名字,选择sdk版本,然后点击Finish,等待,这样一个项目就创建好了。 Android Studio目录...
  • Android Studio 使用入门使用背景新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片 使用背景 1、AS 是基于IntelliJ IDEA开发的,所以Android Studio继承了IntelliJ IDEA的所有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,340
精华内容 8,136
关键字:

androidstudio入门