安卓基础学习(从头开始,持续更新)

标题Android Studio学习

1.活动的基本用法

1.新建一个活动,会有主函数和其相对布局。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2IFw9Zb-1607841793173)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201028145313072.png)]

上面的图片就是在setContenView()中添加我们自主创建的一个活动ID;

2.在AndroidMainfirst文件中注册活动

	* **所有的活动都需要在AndroidMainfirst文件中进行注册才能生效**,配置活动的方法:在<activity>的标签内部加入<intent-filter>标签,并且在标签里面添加
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nflstSfh-1607841793177)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201028150111330.png)]

  • 这串代码相当于把fFirstActivity设置为主活动(即点击桌面应用程序图标时,打开的就是这个活动),打开一个空活动时,标题栏下面的就是在layout中编写的界面。

3.在活动中使用Toast

	* 首先需要定义一个弹出Toast的触发点,首先在layout中创建一个button按钮,把这个按钮当做Toast的触发点,实现效果是:当你点击button时,页面会弹出一个提醒方式。

	* 在onCreate()方法中添加如下代码:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "you clicked button 1",
                        Toast.LENGTH_SHORT).show();
            }
        });
* 在活动中可以通过findViewByID()的方法来获取到布局文件中定义的元素,首先需向下转型把button变成Button的实例化对象。setOnClickListener()为按钮注册了一个监听器,点击按钮就睡执行onClick中的功能。所以,弹出提示Toast的功能代码就在onClick函数中书写了。makeText方法中有三个参数,第一个是Context的对象,直接导入主活动就行;第二个参数是Toast中的显示的内容;第三个参数是显示时长,有两个内置常量可以选择,Toast.LENGTH_SHORE    Toast.LENGTH_LONG

4.在活动中使用菜单MENU

​ 1.首先要在res目录下面新建一个menu文件夹,然后在这个文件夹下面创建一个名为main的菜单文件。然后再main.xml中添加代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="Add"/>

    <item
        android:id="@+id/remove_item"
        android:title="Remove"
        />
</menu>
  • 这里创建了两个菜单项,title就是给具体的菜单项一个标识符。创建完成后需要在返回FirstActivity中重写onCreateOptionsMenu()和onOptionsItemSelected()方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.add_item:
            Toast.makeText(this, "雪宝儿最美",
                    Toast.LENGTH_SHORT).show();
            break;
        case R.id.remove_item:
            Toast.makeText(this, "凯哥哥最帅",
                    Toast.LENGTH_SHORT).show();
            break;
        default:
    }
    return true;
}
  • onOptionsItemSelected()方法中定义的是菜单响应事件,item.getItemId()是用来判断点击的是哪一个具体的菜单事项,然后在每个菜单事项下面添加自己的逻辑代码。

  • 多种菜单的创建:

  • <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:title="listview效果显示"
            android:id="@+id/list_view">
            <menu>
                <item
                    android:title="垂直标准"
                    android:id="@+id/listview_vertical_stander">
                </item>
                <item
                    android:title="垂直反向"
                    android:id="@+id/listview_vertical_reverse">
                </item>
            </menu>
        </item>
    
        <item
            android:title="grad_view效果显示"
            android:id="@+id/grad_view"
            >
            <menu>
                <item
                    android:title="垂直标准"
                    android:id="@+id/gradview_vertical_stander">
                </item>
                <item
                    android:title="垂直反向"
                    android:id="@+id/gradview_vertical_reverse">
                </item>
            </menu>
        </item>
        <item
            android:title="瀑布流效果显示"
            android:id="@+id/stagger_view"
            >
            <menu>
                <item
                    android:title="垂直标准"
                    android:id="@+id/stagview_vertical_stander">
                </item>
                <item
                    android:title="垂直反向"
                    android:id="@+id/stagview_vertical_reverse">
                </item>
            </menu>
        </item>
    </menu>
    
  • onCreateOptionsMenu()和onOptionsItemSelected()方法与普通菜单方法无异,第一个是加载菜单(将菜单布局添加至主布局中),第二个方法用来添加菜单的事件,里面可以添加一些逻辑事件。

5.使用intent在各个活动中穿梭

  • 首先需要创建一个新的活动,但是不要将其设置为主活动。个人比较喜欢用显示intent,所以直接记录显示intent的用法。

  • 首先先创建一个intent,传入FirstActivity作为上下文,传入ThirdActivity作为目标活动,然后通过startActivity(intent2)就可以执行这个intent了。

  • button1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
           Intent intent = new Intent(FirstActivity.this,ThirdActivity.class);
            startActivity(intent2)}
    });
    

6.LinearLayout 布局文件模板:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


</LinearLayout>

7.修改APP名字和图标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQpsO5co-1607841793180)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201127135349146.png)]

android:icon="@mipmap/app_fengmian" //在这个里面修改图标
android:label="@string/app_name" //在这个里面修改名字

2.Ui开发控件知识

1.TextView

  • textview就是很简单的文本显示,在layout中编辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dv3DI8M8-1607841793182)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201028154138702.png)]

android:id = "@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello world"
  • layout_width和layout_height制定了控件的宽度和高度,安卓中所有的控件都有这些属性。match_parent指让当前控件的大小和父布局一样,也就是由父布局来决定当前控件的大小,wrap_content表示让当前控件的大小能刚好包含其中的内容android:gravity="center"表示文字的对齐方式,指定center就是文字在水平和垂直方向上都是居中对齐的。至于字体的大小和颜色,自己考虑。

2.EditText

<EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="1dp"
            android:layout_marginTop="0dp" />
  • 可以输入内容,文本输入框。

  • hint属性就是一个比较高端的属性,它可以在文本输入框内显示提示(在输入内容之前),在输入内容时,这个提示就会消失。

  • 特殊属性:singleLine 是单行输入、inputtype是输入类型,设置为textPassWord就是密码类型,输入的时候显示安全键盘

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOXsS25O-1607841793184)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201103094303050.png)]

  • 账号密码匹配代码:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxOvMx2I-1607841793186)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201103095744780.png)]

3.ImageView

<ImageView
        android:id="@+id/imageView2"
        android:layout_width="149dp"
        android:layout_height="222dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="89dp"
        android:layout_marginRight="100dp"
        app:srcCompat="@drawable/jingerjie" />
  • src属性就是从drawle中调用图片的,给ImageView指定了一张图片

4.button

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button_1"
    android:text="报君黄金台上意,提携玉龙为君死"
    android:background="@android:color/transparent"
    android:textSize="25sp"
    android:textColor="#000000"
    />

尤其注意, android:background="@android:color/transparent"这串代码可以让按钮的背景颜色改成透明,以后再软件美化中可以用到


  • button按钮的实现:

    Button button = findViewByid(R.id.button_1);
    button.setOnClickListener(new View.OnClickListemer(){
        public void onClick(View view) {
                    
    });
    
  • intent 跳转的实现;

    Intent intent3 = new Intent(FirstActivity.this,ForthActivity.class);
                    startActivity(intent3);
    
1.拖动条(progressBar)
  • **1.**自己理解就是一个简单的控件而已,至于进度条想什么时候走完没所谓,反正是做假的。在.xml文件中直接定义就行

  • <ProgressBar
           android:id="@+id/pb"
           style="@android:style/Widget.ProgressBar.Horizontal"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:max="100"
           android:progress="60" />
    
  • android:max : 进度条的最大值

    android:progress : 进度条的精度,自己定义的(所以我说都是假的)

    android:indeterminate : 如果设置为true,就是不显示进度条的精度

    style : 就是设置进度条的样式,是什么类型的,大或小,圆形或者水平(安卓自带样式)

    **2.**实现一个进度条的进度(自动和手动两种方式)

    • 自动:

    • public class ProgressBarActivity extends AppCompatActivity implements View.OnClickListener {
          private int currentProgress = 0;
          private ProgressBar progressBar;
          private int maxProgress;
          private Handler mHandler = new Handler(){
              @Override
              public void handleMessage(@NonNull Message msg) {
                  super.handleMessage(msg);
                  switch (msg.what){
                      case 0 :
                          progressBar.setProgress(currentProgress);
                          break;
                  }
              }
          };
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_progress_bar);
               progressBar = findViewById(R.id.pb);
               maxProgress = progressBar.getMax();
              mtu_pb = findViewById(R.id.pb_mtu);
          }
          @Override
          protected void onStart() {
              super.onStart();
              new Thread(){
                  @Override
                  public void run() {
                      while(true){
                          try {
                              for(int i=0; i<=100; i++){
                                  Thread.sleep(1000);
                                  currentProgress += 10;
                                  if(currentProgress > maxProgress){
                                      break;
                                  }
                                  mHandler.sendEmptyMessage(0);
                              }
                          }catch (InterruptedException e){
                              e.printStackTrace();
                          }
                      }
                  }
              }.start();
          }     
      

      1.可以实现进度条的自动加载,运用多线程的相关知识;

    • 手动:

    • public class ProgressBarActivity extends AppCompatActivity implements View.OnClickListener {
           private ProgressBar progressBar_try;
          private Button mtu_pb;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_progress_bar);
              progressBar_try = findViewById(R.id.pb_try);
              mtu_pb.setOnClickListener(this);
      }
      @Override
          public void onClick(View view) {
              switch (view.getId()){
                  case R.id.pb_mtu:
                      int progress = progressBar_try.getProgress();
                      progress += 10;
                      progressBar_try.setProgress(progress);
                      break;
                      default:
                          break;
              }
          }
      }
      

      可以实现进度条的手动加载,按动一次按钮,就可以实现进度条的一次加载,每次加载10%

2.拖动条seekbar
  • 首先在layout布局文件中创建拖动条

  • <SeekBar
            android:id="@+id/sb_norbal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/txt_cur"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_gravity="center"
            android:textSize="30sp"/>
        <SeekBar
            android:id="@+id/sb_custom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:maxHeight="10dp"
            android:maxWidth="5dp"
            android:progressDrawable="@mipmap/fnegmain"
            android:thumb="@color/colorPrimary"/>
    
  • android:progressDrawable是拖动条的样式,可以放自己喜欢的图片和背景;android:thumb是拖动后显示的背景和颜色。

  • .java文件中,seekbar点击事件有三个方法,第一个是进度条改变,第二个是点击拖动条,第三个是松开进度条

  • protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_seek_bar);
            mContext = this;
            sb_normal = findViewById(R.id.sb_norbal);
            sb_custom = findViewById(R.id.sb_custom);
            txt_cur = findViewById(R.id.txt_cur);
            sb_normal.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                //第一个参数是seekbar的对象,第二个是进度条的值,第三个是是否进度条的值有改变
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    txt_cur.setText("当前进度值: "+ i +" / 100" );
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                    Toast.makeText(mContext,"触碰SeekBar",Toast.LENGTH_SHORT).show();
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    Toast.makeText(mContext,"松开SeekBar",Toast.LENGTH_SHORT).show();
                }
            });
        }
    

5.RadioGroup && RadioButton

  • RadioButton 实际上就是一个选框而已,不过如果没有RadioGroup的存在,RadioButton可以进行多项选择,但是如果存在RadioGroup的制约,它就从多选框变成了单选框。

  • RadioGroup rg = findViewById(R.id.radiugroup);
           rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
               @Override
               public void onCheckedChanged(RadioGroup radioGroup, int i) {
                   switch (i){
                       case R.id.button_1:
                           Log.d("onCheckedChanged","add");
                           Toast.makeText(ThirdActivity.this,"you clicked add",Toast.LENGTH_LONG).show();
                           break;
                       case R.id.button_2:
                           Log.d("onCheckedChanged","delete");
                           Toast.makeText(ThirdActivity.this,"you clicked delete",Toast.LENGTH_LONG).show();
                           break;
                           default:
                               break;
                   }
               }
           });
    
  • 用法和button按钮的基本一样,只是在设置点击事件的时候略有不同,自己注意体会。

  • RadioGroup && RadioButton的嵌套使用如下:

  • <RadioGroup
            android:id="@+id/radiugroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="delete"
                android:textAllCaps="false"
                android:textSize="30sp"
                android:id="@+id/button_2">
            </RadioButton>
    
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="add"
                android:textAllCaps="false"
                android:textSize="30sp"
                android:id="@+id/button_1">
            </RadioButton>
        </RadioGroup>
    
    

6…CheckBoxs复选框的实际应用

  • CheckBoxs是复选框,和RadioGroup && RadioButton没什么太大的区别

  • <CheckBox
              android:id="@+id/check_basket"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="篮球"/>
    
  • cb_basket = findViewById(R.id.check_basket);
           cb_basket.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
               @Override
               public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                   Intent intent = new Intent(ThirdActivity.this,MainActivity.class);
                   startActivity(intent);
               }
           });
    
  • 以上代码就是在实际开发中对复选框的运用***数据类型是boolean类型***

7.对话框的实际应用

  • public class ThirdActivity extends AppCompatActivity implements  View.OnClickListener{
            Button button2 = findViewById(R.id.button_adalog);
            button2.setOnClickListener(this);
       @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(ThirdActivity.this);
            switch (view.getId()){
                case R.id.button_adalog:
                    builder.setTitle("对话框");
                    builder.setMessage("今晚喝酒吗");
                    builder.setCancelable(false);
                    builder.setPositiveButton("走", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Toast.makeText(ThirdActivity.this,"你也配喝酒",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                    builder.setNegativeButton("不去,我要敲代码", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Toast.makeText(ThirdActivity.this,"好小子!",Toast.LENGTH_LONG).show();
                        }
                    });
                    break;
                case R.id.button_adalog2:
                    builder.setTitle("单选对话框");
                    builder.setIcon(R.mipmap.ic_launcher);
                    builder.setSingleChoiceItems(new String[]{
                          "好的,一起吧。","不,我要当废物。","都行"
                    }, 0, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Toast.makeText(ThirdActivity.this,"选中的",Toast.LENGTH_SHORT).show();
                        }
                    });
                    break;
            }
            builder,show();
        }
    }
     
    
    
  • 上述代码是.java文件里面的所属代码,首先函数名不仅仅需要继承AppCompatActivity,想要使用 AlertDialog,函数名还要继承View.OnClickListener接口,然后在函数中覆写onClick函数,以此表示按钮的点击事件。

  • 在layout 布局文件中,则是直接创建一个按钮即可。

  • onClick覆写中,上述代码使用switch-case语句是因为有单选对话框的存在,必须要判断点击的是那个按钮,然后才能实现相关功。在对应的case语句下面编写其逻辑代码。

8.listview的使用

<ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fastScrollEnabled="true"
        android:id="@+id/lv_main">
    </ListView>
  • 首先需要创建一个布局,在里面添加一个listview,宽度高度自己调整,记得控件必须添加一个id

  • 然后在.java文件中添加实现listview的代码

  • public class ListViewTry extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list_view_try);
            ListView lv = findViewById(R.id.lv_main);
            lv.setAdapter(new MyListViewAdapter());
        }
        public class MyListViewAdapter extends BaseAdapter{
            private TextView tv;
            @Override
            public int getCount() {
                return 100;
            }
            @Override
            public Object getItem(int i) {
                return null;
            }
            @Override
            public long getItemId(int i) {
                return 0;
            }
            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
                if(view == null){
                    tv = new TextView(ListViewTry.this);
                }
                else{
                    tv = (TextView)view;
                }
                tv.setText("蝌蚪!"+i);
                return tv;
            }
        }
    }
    
    
  • 上述代码用来实现listview效果,首先需要找到我们需要的控件ID,ListView lv = findViewById(R.id.lv_main);完成功能。然后需要向listview添加数据,这就需要自己建立一个数据类,让他继承BaseAdapter,继承里面的方法,第一个方法public int getCount()是用来实现显示几行; public View getView方法是用来显示listview中的文字。最后lv.setAdapter(new MyListViewAdapter());即可。

9.ScrollView及HorizontalScrollView

  • <?xml version="1.0" encoding="utf-8"?>
    <ScrollView 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=".Scrollview"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="test1"
                android:id="@+id/test1"/>
    
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="test2"
                android:id="@+id/test2"/>
            
            <HorizontalScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
    
                    <Button
                        android:layout_width="200dp"
                        android:layout_height="200dp"
                        android:id="@+id/HScrollview1"
                        android:text="Htext1"/>
                    <Button
                        android:layout_width="200dp"
                        android:layout_height="200dp"
                        android:id="@+id/HScrollview2"
                        android:text="Htext2"/>
                </LinearLayout>
            </HorizontalScrollView>
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/text6"
                android:text="the last text"
                android:layout_marginTop="200dp"/>
        </LinearLayout>
    
    </ScrollView>
    
  • 上述代码可以知道两种滚动布局的用法,ScrollView是主布局,直接作用在布局里面,而HorizontalScrollView布局则是作用在ScrollView中,是它的子布局,嵌套在其中。前者是垂直布局,后者是水平布局。但是需要注意,两种布局下面都要用LinearLayout布局来实现,LinearLayout中可以添加控件

10.RecycleView 的使用

1.利用RecycleView实现listview
  • public class LinearRecycleViewActivity extends AppCompatActivity {
        private RecyclerView myrcv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_linear_recycle_view);
            myrcv = findViewById(R.id.rv_main);
            myrcv.setLayoutManager(new LinearLayoutManager(LinearRecycleViewActivity.this));
            myrcv.setAdapter(new LinearAdapter(LinearRecycleViewActivity.this));
        }
    }
    
  •     <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    
  • 首先创建一个活动,在布局里面添加一个RecycleView。.java文件中找到所用的控件,然后设置一个布局管理器,最后设置一个数据适配器。

  • public class LinearAdapter extends RecyclerView.Adapter <LinearAdapter.LinearViewHolder>{
        private  Context mcontext;
    
        public LinearAdapter(Context context){
            this.mcontext = context;
        }
        @NonNull
        @Override
        public LinearAdapter.LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new LinearViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.linear_recycle,parent,false));
        }
    
        @Override
        public void onBindViewHolder(@NonNull LinearAdapter.LinearViewHolder holder, final int position) {
            holder.textview.setText("hello kedou");
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(mcontext,"you click the"+position,Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        @Override
        public int getItemCount() {
            return 100;
        }
    
        class LinearViewHolder extends RecyclerView.ViewHolder{
            private TextView textview;
            public LinearViewHolder(View itemView){
                super(itemView);
                textview = itemView.findViewById(R.id.tv_title);
            }
        }
    }
    
  • <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="蝌蚪"
            android:id="@+id/tv_title"
            android:gravity="center"
            android:textSize="20sp"
            android:textColor="#000000"
            android:background="@drawable/abc_vector_test"/>	
    
  • 首先创建一个布局文件,此布局文件中添加一个想要在RecycleView中显示的控件。在.java文件中,数据适配器需要继承RecycleView的适配器,然后继承相关方法。 onCreateViewHolder方法用来创建一个ViewHolder的实例,onBindViewHolder方法用来绑定布局,可以在里面添加一些逻辑事件(设置文字,显示弹窗之类的),getItemCount方法用来返回列表的长度。class LinearViewHolder extends RecyclerView.ViewHolder是用来满足适配器的泛型事件。

11Fragment的使用

1.静态加载fragment
  • public class Myfragment extends Fragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            //第七行代码是用来加载布局的主要代码
            View view = inflater.inflate(R.layout.activity_myfragment,container,false);
            return view;
        }
    }
    
    
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OXgUSY4n-1607841793187)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201123215714037.png)]

  • <?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="horizontal">
    
        <fragment
            android:name="com.example.frag1.Fragment.Myfragment"
            android:id="@+id/myfragment"
            android:layout_width="match_parent"
            android:layout_height="300dp" />
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_marginTop="30dp"
            android:id="@+id/rl_fragment"/>
    
    </LinearLayout>
    
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tFz7RBp-1607841793188)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201123215800014.png)]

  • 静态加载碎片,其实是非常简单的,首先需要创建一个活动,这个类必须继承Fragment。在这个活动下面的布局里面就可以写想要在碎片中加载的东西,可以在里面添加一些简单的控件,在.java文件中,需要public View onCreateView方法来实现碎片的加载,具体请看上述代码。然后在主函数的布局中添加一个标签fragment,作为容器,直接运行即可加载碎片。

2.动态加载碎片
  • 首先创建一个活动作为主活动,在主活动的布局文件中添加一个FragLayout,作为所有碎片的容器。

  • <FrameLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_below="@id/ly_top_bar"
           android:layout_above="@id/div_tab_bar"
           android:id="@+id/ly_content1"
           android:background="@android:color/transparent">
       </FrameLayout>
    
  • 然后创建其他活动,在其布局文件中添加自己想要的效果,在其.java文件中重写View onCreateView方法表示添加布局。

  • 主活动需要写碎片的实现:

  • private void replacefragemnt(MyFragment_tishi myFragment_tishi){
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
        //尤为重要的是,第五行的代码,碎片的被代替布局必须是在主函数中自己写的碎片容器,代替者是代替函数中活动的对象。
            transaction.replace(R.id.ly_content1,myFragment_tishi);
            transaction.commit();
        }
    //下面这串代码可以添加在逻辑事件中,调用replace方法,实现碎片的动态添加
        replacefragemnt(new MyFragment_tishi());
    
  
* 首先自定义一个代替方法,是将碎片中原有的事物代替成为一个新的事物(新的事物就是自己写的几个活动),然后在点击事件中调用自定义的代替方法,碎片的动态添加就可以完成。

## 3.存储数据

### 1.SharedPreferences数据存储

* ```java
  Button button2 = findViewById(R.id.button2);
          button2.setOnClickListener(new View.OnClickListener(){
              public void onClick(View v){
                  SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
                  editor.putString("name","tom");
                  editor.putInt("age",20);
                  editor.putBoolean("married",false);
                  editor.apply();
              }
          });
  • button按钮逻辑中实现数据的存储

  • 调用SharedPreferences对象的edit方法来获取haredPreferences.Editor对象,然后向该对象中添加数据,添加完毕后通过apply方法将数据提交,完成数据的存储。

2.从SharedPreferences读取数据

  • 此代码布局文件中使用了chrckBox复选框记住密码来实现功能操作。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGIRoQQl-1607841793189)(C:\Users\23737\AppData\Roaming\Typora\typora-user-images\image-20201103111410884.png)]

  • private SharedPreferences pref;
       private SharedPreferences.Editor editor;
       private CheckBox remember;
    Button button = findViewById(R.id.button);
           button.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   String editone = edit1.getText().toString();
                   String edittwo =  edit2.getText().toString();
                   if(editone.equals("2373704672") && edittwo.equals("lxswwy.1314")){
                       editor = pref.edit();
                       if(remember.isChecked()){
                           editor.putBoolean("remember password",true);
                           editor.putString("account:",editone);
                           editor.putString("password:",edittwo);
                       }else{
                           editor.clear();
                       }
                       editor.apply();
                       Intent intent =  new Intent(MainActivity.this,FirstActivity.class);
                       startActivity(intent);
                       finish();
                   }
                   else{
                       Toast.makeText(MainActivity.this,"账号或密码输入有误",Toast.LENGTH_LONG).show();
                   }
               }
           });
    
  • 按钮中实现自动存入密码功能

3.数据库SQLIte

  • SQLiteOpenHelper的其中一个使用比较多的构造方法中,里面有四个参数,第一个是context,第二个是数据库的名字,第三个是查询数据时返回一个自定义的Cursor,一般都是传入null,最后一个是版本号。

  • 首先新建一个类,继承SQLiteOpenHelper

  • public class MyDatabaseHelper extends SQLiteOpenHelper {
    
        public static final String CREATE_BOOK = "create tabke Book("
                + "id integer primary key autoincrement,"
                + "author text,"
                + "price real,"
                + "pages integer,"
                +"name text)";
    
        private Context mContext;
    
    
        public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            mContext = context;
        }
    
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL(CREATE_BOOK);
            Toast.makeText(mContext, "create successed", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        }
    }
    
    
  • 然后在主函数中加以实现

  • private MyDatabaseHelper dbhelper;
    dbhelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
            Button button  = findViewById(R.id.button_sql);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dbhelper.getWritableDatabase();
                }
            });
    
  • 上述代码是以按钮为操作连接,然后实现数据库的创建。

4.多媒体使用

1.通知的实现:

  • public class MainActivity extends AppCompatActivity implements View.OnClickListener
        final int NOTIFYID = 0x123;
        private Button mybtu;
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mybtu = findViewById(R.id.btu_inform);
            mybtu.setOnClickListener(this);
        }
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btu_inform:
                    final NotificationManager notificationManager =
                        (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                    // 创建一个Notification对象
                    Notification.Builder notification = new Notification.Builder(this);
                    // 设置打开该通知,该通知自动消失
                    notification.setAutoCancel(true);
                    // 设置通知的图标
                    notification.setSmallIcon(R.mipmap.ic_launcher);
                    // 设置通知内容的标题
                    notification.setContentTitle("哈哈哈哈哈哈");
                    // 设置通知内容
                    notification.setContentText("点击查看详情!");
                    //设置使用系统默认的声音、默认震动
                    notification.setDefaults(Notification.DEFAULT_SOUND
                        | Notification.DEFAULT_VIBRATE);
                    //设置发送时间
                    notification.setWhen(System.currentTimeMillis());
                    // 创建一个启动其他Activity的Intent
                    Intent intent = new Intent(MainActivity.this
                        , DetailActivity.class);
                    PendingIntent pi = PendingIntent.getActivity(
                        MainActivity.this, 0, intent, 0);
                    //设置通知栏点击跳转
                    notification.setContentIntent(pi);
                    //发送通知
                    notificationManager.notify(NOTIFYID, notification.build());
                    break;
                    default:
                        break;
            }
        }
    }
    
    • 上述代码已经有很明确的注解,此处不做阐释。DetailActivity是点击通知后跳转的页面.

    2.摄像头拍照

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="take photo"
        android:textAllCaps="false">
    </Button>

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">
    </ImageView>
</LinearLayout>
// .java文件
public class MainActivity extends AppCompatActivity {

    public static final int TAKE_PHOTO = 1;
    private ImageView PICTURE;
    private Uri imageUri;


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

        Button takePhoto = findViewById(R.id.take_photo);
        PICTURE = findViewById(R.id.picture);
        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File outputImage = new File(getExternalCacheDir(),"output_image.jpg");
                try{
                    if(outputImage.exists()){
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                }catch (IOException e){
                    e.printStackTrace();
                }

                if (Build.VERSION.SDK_INT >= 24){
                    imageUri = FileProvider.getUriForFile(MainActivity.this,
                            "com.example.cameraalbumtest.fileprovider",
                            outputImage);
                }else {
                    imageUri = Uri.fromFile(outputImage);
                }

                //启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
                startActivityForResult(intent,TAKE_PHOTO);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case TAKE_PHOTO:
                if (requestCode == RESULT_OK){
                    try{
                        //将拍摄的照片显示出来
                        Bitmap bitmap =BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        PICTURE.setImageBitmap(bitmap);
                    }catch (FileNotFoundException e){
                        e.printStackTrace();
                    }
                }
                break;
                default:
                    break;
        }
    }
}

调取系统相册

新增一个方法

public void openGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, CROP_PHOTO);
    }

把按钮的点击事件改为:

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.take_photo:
                //openCamera(this);
                openGallery();
                break;
        }
    }

因为这里请求码为CROP_PHOTO,因此对上边的CROP_PHOTO做些改造

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                ...
                break;
            case CROP_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        if(data != null) {
                            Uri uri = data.getData();
                            imageUri = uri;
                        }
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                .openInputStream(imageUri));
                        picture.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            default:
                super.onActivityResult(requestCode, resultCode, data);
                break;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值