Android 学习

Android Studio学习

1.活动的基本用法

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

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

2.在AndroidMainfirst文件中注册活动

    * **所有的活动都需要在AndroidMainfirst文件中进行注册才能生效**,配置活动的方法:在的标签内部加入标签,并且在标签里面添加

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

3.在活动中使用Toast

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

    * 在onCreate()方法中添加如下代码:

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.first_layout);

Buttonbutton1=(Button)findViewById(R.id.button_1);

button1.setOnClickListener(newView.OnClickListener() {

publicvoidonClick(Viewv) {

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中添加代码:

android:id="@+id/add_item"

android:title="Add"/>

android:id="@+id/remove_item"

android:title="Remove"

/>

这里创建了两个菜单项,title就是给具体的菜单项一个标识符。创建完成后需要在返回FirstActivity中重写onCreateOptionsMenu()和onOptionsItemSelected()方法

@Override

publicbooleanonCreateOptionsMenu(Menumenu) {

getMenuInflater().inflate(R.menu.main,menu);

returntrue;

}

@Override

publicbooleanonOptionsItemSelected(@NonNullMenuItemitem) {

switch(item.getItemId()) {

caseR.id.add_item:

Toast.makeText(this,"雪宝儿最美",

Toast.LENGTH_SHORT).show();

break;

caseR.id.remove_item:

Toast.makeText(this,"凯哥哥最帅",

Toast.LENGTH_SHORT).show();

break;

default:

   }

returntrue;

}

onOptionsItemSelected()方法中定义的是菜单响应事件,item.getItemId()是用来判断点击的是哪一个具体的菜单事项,然后在每个菜单事项下面添加自己的逻辑代码。

多种菜单的创建:

android:title="listview效果显示"

android:id="@+id/list_view">

android:title="垂直标准"

android:id="@+id/listview_vertical_stander">

android:title="垂直反向"

android:id="@+id/listview_vertical_reverse">

android:title="grad_view效果显示"

android:id="@+id/grad_view"

>

android:title="垂直标准"

android:id="@+id/gradview_vertical_stander">

android:title="垂直反向"

android:id="@+id/gradview_vertical_reverse">

android:title="瀑布流效果显示"

android:id="@+id/stagger_view"

>

android:title="垂直标准"

android:id="@+id/stagview_vertical_stander">

android:title="垂直反向"

android:id="@+id/stagview_vertical_reverse">

onCreateOptionsMenu()和onOptionsItemSelected()方法与普通菜单方法无异,第一个是加载菜单(将菜单布局添加至主布局中),第二个方法用来添加菜单的事件,里面可以添加一些逻辑事件。

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

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

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

button1.setOnClickListener(newView.OnClickListener() {

publicvoidonClick(Viewv) {

Intentintent=newIntent(FirstActivity.this,ThirdActivity.class);

startActivity(intent2);

   }

});

6.LinearLayout 布局文件模板:

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

7.修改APP名字和图标

android:icon="@mipmap/app_fengmian"//在这个里面修改图标

android:label="@string/app_name"//在这个里面修改名字

2.Ui开发控件知识

1.TextView

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

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

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就是密码类型,输入的时候显示安全键盘

账号密码匹配代码:

3.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

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按钮的实现:

Buttonbutton=findViewByid(R.id.button_1);

button.setOnClickListener(newView.OnClickListemer(){

publicvoidonClick(Viewview) {


});

intent 跳转的实现;

Intentintent3=newIntent(FirstActivity.this,ForthActivity.class);

startActivity(intent3);

1.拖动条(progressBar)

1.自己理解就是一个简单的控件而已,至于进度条想什么时候走完没所谓,反正是做假的。在.xml文件中直接定义就行

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.实现一个进度条的进度(自动和手动两种方式)

自动:

publicclassProgressBarActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateintcurrentProgress=0;

privateProgressBarprogressBar;

privateintmaxProgress;

privateHandlermHandler=newHandler(){

@Override

publicvoidhandleMessage(@NonNullMessagemsg) {

super.handleMessage(msg);

switch(msg.what){

case0:

progressBar.setProgress(currentProgress);

break;

           }

       }

   };

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

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

protectedvoidonStart() {

super.onStart();

newThread(){

@Override

publicvoidrun() {

while(true){

try{

for(inti=0;i<=100;i++){

Thread.sleep(1000);

currentProgress+=10;

if(currentProgress>maxProgress){

break;

                           }

mHandler.sendEmptyMessage(0);

                       }

}catch(InterruptedExceptione){

e.printStackTrace();

                   }

               }

           }

}.start();

   }    

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

手动:

publicclassProgressBarActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateProgressBarprogressBar_try;

privateButtonmtu_pb;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_progress_bar);

progressBar_try=findViewById(R.id.pb_try);

mtu_pb.setOnClickListener(this);

}

@Override

publicvoidonClick(Viewview) {

switch(view.getId()){

caseR.id.pb_mtu:

intprogress=progressBar_try.getProgress();

progress+=10;

progressBar_try.setProgress(progress);

break;

default:

break;

       }

   }

}

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

2.拖动条seekbar

首先在layout布局文件中创建拖动条

android:id="@+id/sb_norbal"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

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

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点击事件有三个方法,第一个是进度条改变,第二个是点击拖动条,第三个是松开进度条

protectedvoidonCreate(BundlesavedInstanceState) {

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(newSeekBar.OnSeekBarChangeListener() {

@Override

//第一个参数是seekbar的对象,第二个是进度条的值,第三个是是否进度条的值有改变

publicvoidonProgressChanged(SeekBarseekBar,inti,booleanb) {

txt_cur.setText("当前进度值: "+i+" / 100");

           }

@Override

publicvoidonStartTrackingTouch(SeekBarseekBar) {

Toast.makeText(mContext,"触碰SeekBar",Toast.LENGTH_SHORT).show();

           }

@Override

publicvoidonStopTrackingTouch(SeekBarseekBar) {

Toast.makeText(mContext,"松开SeekBar",Toast.LENGTH_SHORT).show();

           }

       });

   }

5.RadioGroup && RadioButton

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

RadioGrouprg=findViewById(R.id.radiugroup);

rg.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){

@Override

publicvoidonCheckedChanged(RadioGroupradioGroup,inti) {

switch(i){

caseR.id.button_1:

Log.d("onCheckedChanged","add");

Toast.makeText(ThirdActivity.this,"you clicked add",Toast.LENGTH_LONG).show();

break;

caseR.id.button_2:

Log.d("onCheckedChanged","delete");

Toast.makeText(ThirdActivity.this,"you clicked delete",Toast.LENGTH_LONG).show();

break;

default:

break;

              }

          }

      });

用法和button按钮的基本一样,只是在设置点击事件的时候略有不同,自己注意体会。

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

android:id="@+id/radiugroup"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="delete"

android:textAllCaps="false"

android:textSize="30sp"

android:id="@+id/button_2">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="add"

android:textAllCaps="false"

android:textSize="30sp"

android:id="@+id/button_1">

6..CheckBoxs复选框的实际应用

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

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(newCompoundButton.OnCheckedChangeListener() {

@Override

publicvoidonCheckedChanged(CompoundButtoncompoundButton,booleanb) {

Intentintent=newIntent(ThirdActivity.this,MainActivity.class);

startActivity(intent);

          }

      });

以上代码就是在实际开发中对复选框的运用数据类型是boolean类型

7.对话框的实际应用

publicclassThirdActivityextendsAppCompatActivityimplementsView.OnClickListener{

Buttonbutton2=findViewById(R.id.button_adalog);

button2.setOnClickListener(this);

@Override

publicvoidonClick(Viewview) {

AlertDialog.Builderbuilder=newAlertDialog.Builder(ThirdActivity.this);

switch(view.getId()){

caseR.id.button_adalog:

builder.setTitle("对话框");

builder.setMessage("今晚喝酒吗");

builder.setCancelable(false);

builder.setPositiveButton("走",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"你也配喝酒",

Toast.LENGTH_LONG).show();

                   }

               });

builder.setNegativeButton("不去,我要敲代码",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"好小子!",Toast.LENGTH_LONG).show();

                   }

               });

break;

caseR.id.button_adalog2:

builder.setTitle("单选对话框");

builder.setIcon(R.mipmap.ic_launcher);

builder.setSingleChoiceItems(newString[]{

"好的,一起吧。","不,我要当废物。","都行"

},0,newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterfacedialogInterface,inti) {

Toast.makeText(ThirdActivity.this,"选中的",Toast.LENGTH_SHORT).show();

                   }

               });

break;

       }

   }

}

上述代码是.java文件里面的所属代码,首先函数名不仅仅需要继承AppCompatActivity,想要使用 AlertDialog,函数名还要继承View.OnClickListener接口,然后在函数中覆写onClick函数,以此表示按钮的点击事件。

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

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

8.listview的使用

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:fastScrollEnabled="true"

android:id="@+id/lv_main">

首先需要创建一个布局,在里面添加一个listview,宽度高度自己调整,记得控件必须添加一个id

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

publicclassListViewTryextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_list_view_try);

ListViewlv=findViewById(R.id.lv_main);

lv.setAdapter(newMyListViewAdapter());

   }

publicclassMyListViewAdapterextendsBaseAdapter{

privateTextViewtv;

@Override

publicintgetCount() {

return100;

       }

@Override

publicObjectgetItem(inti) {

returnnull;

       }

@Override

publiclonggetItemId(inti) {

return0;

       }

@Override

publicViewgetView(inti,Viewview,ViewGroupviewGroup) {

if(view==null){

tv=newTextView(ListViewTry.this);

           }

else{

tv=(TextView)view;

           }

tv.setText("蝌蚪!"+i);

returntv;

       }

   }

}

上述代码用来实现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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="test1"

android:id="@+id/test1"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="test2"

android:id="@+id/test2"/>


android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_width="200dp"

android:layout_height="200dp"

android:id="@+id/HScrollview1"

android:text="Htext1"/>

android:layout_width="200dp"

android:layout_height="200dp"

android:id="@+id/HScrollview2"

android:text="Htext2"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/text6"

android:text="the last text"

android:layout_marginTop="200dp"/>

上述代码可以知道两种滚动布局的用法,ScrollView是主布局,直接作用在布局里面,而HorizontalScrollView布局则是作用在ScrollView中,是它的子布局,嵌套在其中。前者是垂直布局,后者是水平布局。但是需要注意,两种布局下面都要用LinearLayout布局来实现,LinearLayout中可以添加控件

10.RecycleView 的使用

1.利用RecycleView实现listview

publicclassLinearRecycleViewActivityextendsAppCompatActivity{

privateRecyclerViewmyrcv;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_linear_recycle_view);

myrcv=findViewById(R.id.rv_main);

myrcv.setLayoutManager(newLinearLayoutManager(LinearRecycleViewActivity.this));

myrcv.setAdapter(newLinearAdapter(LinearRecycleViewActivity.this));

   }

}

android:id="@+id/rv_main"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

首先创建一个活动,在布局里面添加一个RecycleView。.java文件中找到所用的控件,然后设置一个布局管理器,最后设置一个数据适配器。

publicclassLinearAdapterextendsRecyclerView.Adapter{

privateContextmcontext;

publicLinearAdapter(Contextcontext){

this.mcontext=context;

   }

@NonNull

@Override

publicLinearAdapter.LinearViewHolderonCreateViewHolder(@NonNullViewGroupparent,intviewType) {

returnnewLinearViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.linear_recycle,parent,false));

   }

@Override

publicvoidonBindViewHolder(@NonNullLinearAdapter.LinearViewHolderholder,finalintposition) {

holder.textview.setText("hello kedou");

holder.itemView.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

Toast.makeText(mcontext,"you click the"+position,Toast.LENGTH_SHORT).show();

           }

       });

   }

@Override

publicintgetItemCount() {

return100;

   }

classLinearViewHolderextendsRecyclerView.ViewHolder{

privateTextViewtextview;

publicLinearViewHolder(ViewitemView){

super(itemView);

textview=itemView.findViewById(R.id.tv_title);

       }

   }

}

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

publicclassMyfragmentextendsFragment{

@Nullable

@Override

publicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState) {

//第七行代码是用来加载布局的主要代码

Viewview=inflater.inflate(R.layout.activity_myfragment,container,false);

returnview;

   }

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

android:name="com.example.frag1.Fragment.Myfragment"

android:id="@+id/myfragment"

android:layout_width="match_parent"

android:layout_height="300dp"/>

android:layout_width="match_parent"

android:layout_height="300dp"

android:layout_marginTop="30dp"

android:id="@+id/rl_fragment"/>

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

2.动态加载碎片

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

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

然后创建其他活动,在其布局文件中添加自己想要的效果,在其.java文件中重写View onCreateView方法表示添加布局。

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

privatevoidreplacefragemnt(MyFragment_tishimyFragment_tishi){

FragmentManagerfragmentManager=getSupportFragmentManager();

FragmentTransactiontransaction=fragmentManager.beginTransaction();

//尤为重要的是,第五行的代码,碎片的被代替布局必须是在主函数中自己写的碎片容器,代替者是代替函数中活动的对象。

transaction.replace(R.id.ly_content1,myFragment_tishi);

transaction.commit();

   }

//下面这串代码可以添加在逻辑事件中,调用replace方法,实现碎片的动态添加

replacefragemnt(newMyFragment_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方法将数据提交,完成数据的存储。

3.数据的存储

1.从SharedPreferences读取数据

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

privateSharedPreferencespref;

privateSharedPreferences.Editoreditor;

privateCheckBoxremember;

Buttonbutton=findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

Stringeditone=edit1.getText().toString();

Stringedittwo=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();

Intentintent=newIntent(MainActivity.this,FirstActivity.class);

startActivity(intent);

finish();

              }

else{

Toast.makeText(MainActivity.this,"账号或密码输入有误",Toast.LENGTH_LONG).show();

              }

          }

      });

按钮中实现自动存入密码功能

2.数据库SQLIte

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

首先新建一个类,继承SQLiteOpenHelper

publicclassMyDatabaseHelperextendsSQLiteOpenHelper{

publicstaticfinalStringCREATE_BOOK="create tabke Book("

+"id integer primary key autoincrement,"

+"author text,"

+"price real,"

+"pages integer,"

+"name text)";

privateContextmContext;

publicMyDatabaseHelper(@NullableContextcontext,@NullableStringname,@NullableSQLiteDatabase.CursorFactoryfactory,intversion) {

super(context,name,factory,version);

mContext=context;

   }

@Override

publicvoidonCreate(SQLiteDatabasesqLiteDatabase) {

sqLiteDatabase.execSQL(CREATE_BOOK);

Toast.makeText(mContext,"create successed",Toast.LENGTH_SHORT).show();

   }

@Override

publicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,intoldVersion,intnewVersion) {

   }

}

然后在主函数中加以实现

privateMyDatabaseHelperdbhelper;

dbhelper=newMyDatabaseHelper(this,"BookStore.db",null,1);

Buttonbutton=findViewById(R.id.button_sql);

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

dbhelper.getWritableDatabase();

           }

       });

上述代码是以按钮为操作连接,然后实现数据库的创建。

4.多媒体使用

1.通知的实现:

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener

finalintNOTIFYID=0x123;

privateButtonmybtu;

@RequiresApi(api=Build.VERSION_CODES.JELLY_BEAN)

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

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

publicvoidonClick(Viewview) {

switch(view.getId()){

caseR.id.btu_inform:

finalNotificationManagernotificationManager=

(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

// 创建一个Notification对象

Notification.Buildernotification=newNotification.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

Intentintent=newIntent(MainActivity.this

,DetailActivity.class);

PendingIntentpi=PendingIntent.getActivity(

MainActivity.this,0,intent,0);

//设置通知栏点击跳转

notification.setContentIntent(pi);

//发送通知

notificationManager.notify(NOTIFYID,notification.build());

break;

default:

break;

       }

   }

}

上述代码已经有很明确的注解,此处不做阐释。DetailActivity是点击通知后跳转的页面. 

2.摄像头拍照

xml文件:

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

android:id="@+id/take_photo"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="take photo"

android:textAllCaps="false">

android:id="@+id/picture"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center">

// .java文件

publicclassMainActivityextendsAppCompatActivity{

publicstaticfinalintTAKE_PHOTO=1;

privateImageViewPICTURE;

privateUriimageUri;

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButtontakePhoto=findViewById(R.id.take_photo);

PICTURE=findViewById(R.id.picture);

takePhoto.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewview) {

FileoutputImage=newFile(getExternalCacheDir(),"output_image.jpg");

try{

if(outputImage.exists()){

outputImage.delete();

                   }

outputImage.createNewFile();

}catch(IOExceptione){

e.printStackTrace();

               }

if(Build.VERSION.SDK_INT>=24){

imageUri=FileProvider.getUriForFile(MainActivity.this,

"com.example.cameraalbumtest.fileprovider",

outputImage);

}else{

imageUri=Uri.fromFile(outputImage);

               }

//启动相机程序

Intentintent=newIntent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

startActivityForResult(intent,TAKE_PHOTO);

           }

       });

   }

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,@NullableIntentdata) {

switch(requestCode){

caseTAKE_PHOTO:

if(requestCode==RESULT_OK){

try{

//将拍摄的照片显示出来

Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));

PICTURE.setImageBitmap(bitmap);

}catch(FileNotFoundExceptione){

e.printStackTrace();

                   }

               }

break;

default:

break;

       }

   }

}

调取系统相册

新增一个方法

publicvoidopenGallery() {

Intentintent=newIntent(Intent.ACTION_PICK);

intent.setType("image/*");

startActivityForResult(intent,CROP_PHOTO);

   }

把按钮的点击事件改为:

@Override

publicvoidonClick(Viewv) {

switch(v.getId()) {

caseR.id.take_photo:

//openCamera(this);

openGallery();

break;

       }

   }

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

@Override

publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata) {

switch(requestCode) {

caseTAKE_PHOTO:

               ...

break;

caseCROP_PHOTO:

if(resultCode==RESULT_OK) {

try{

if(data!=null) {

Uriuri=data.getData();

imageUri=uri;

                       }

Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver()

.openInputStream(imageUri));

picture.setImageBitmap(bitmap);

}catch(FileNotFoundExceptione) {

e.printStackTrace();

                   }

               }

break;

default:

super.onActivityResult(requestCode,resultCode,data);

break;

       }

   }

你可能感兴趣的:(Android 学习)