标题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;
}
}