Android Studio学习
1.活动的基本用法
1.新建一个活动,会有主函数和其相对布局。
上面的图片就是在setContenView()中添加我们自主创建的一个活动ID;
2.在AndroidMainfirst文件中注册活动
* **所有的活动都需要在AndroidMainfirst文件中进行注册才能生效**,配置活动的方法:在的标签内部加入标签,并且在标签里面添加
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
这串代码相当于把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中添加代码:
<menuxmlns: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
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()是用来判断点击的是哪一个具体的菜单事项,然后在每个菜单事项下面添加自己的逻辑代码。
多种菜单的创建:
<?xmlversion="1.0"encoding="utf-8"?>
<menuxmlns: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(newView.OnClickListener() {
publicvoidonClick(Viewv) {
Intentintent=newIntent(FirstActivity.this,ThirdActivity.class);
startActivity(intent2);
}
});
6.LinearLayout 布局文件模板:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
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
<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
<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按钮的实现:
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文件中直接定义就行
<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.实现一个进度条的进度(自动和手动两种方式)
自动:
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布局文件中创建拖动条
<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点击事件有三个方法,第一个是进度条改变,第二个是点击拖动条,第三个是松开进度条
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的嵌套使用如下:
<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(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的使用
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fastScrollEnabled="true"
android:id="@+id/lv_main">
</ListView>
首先需要创建一个布局,在里面添加一个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
<?xmlversion="1.0"encoding="utf-8"?>
<ScrollViewxmlns: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
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));
}
}
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
首先创建一个活动,在布局里面添加一个RecycleView。.java文件中找到所用的控件,然后设置一个布局管理器,最后设置一个数据适配器。
publicclassLinearAdapterextendsRecyclerView.Adapter<LinearAdapter.LinearViewHolder>{
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);
}
}
}
<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
publicclassMyfragmentextendsFragment{
@Nullable
@Override
publicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState) {
//第七行代码是用来加载布局的主要代码
Viewview=inflater.inflate(R.layout.activity_myfragment,container,false);
returnview;
}
}
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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>
静态加载碎片,其实是非常简单的,首先需要创建一个活动,这个类必须继承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方法表示添加布局。
主活动需要写碎片的实现:
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文件:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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文件
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;
}
}