侧滑栏
可以直接使用模板
也可使用DrawerLayout简单写一个。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
//建议使用start
tools:openDrawer="start"
android:id="@+id/drawer"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
//页面内容
</LinearLayout>
<LinearLayout
android:layout_width="200dp"
android:layout_height="match_parent"
android:id="@+id/drawer_ll"
android:orientation="vertical"
android:background="#fff"
android:layout_gravity="start"
>
//侧滑栏内容
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
//使用openDrawer方法点击打开侧滑栏
//drawer_ll = findViewById(R.id.drawer_ll);
//drawer = findViewById(R.id.drawer);
//drawer.openDrawer(drawer_ll);
引导页
上部分显示三张图片,左右滑动可以切换图片
- ViewPager
1.创建三个xml文件(view),xml中装一张图片。
2.使用List<View>将view装在集合中
viewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
//view的数量
return views.size();
}
@Override
public boolean isViewFromObject(View view,Object object) {
//这么写就对了
return view == object;
}
@NonNull
@Override
public Object instantiateItem(ViewGroup container, int position) {
//添加View,设置View
container.addView(views.get(position));
return views.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position,Object object) {
//销毁View
container.removeView(views.get(position));
}
});
4.获取当前选中的View的index,设置指示器
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
//设置指示器
radio.check(position+1);
//当为第三张图片时按钮显示
if (position+1 == 3){
to_btn.setVisibility(to_btn.VISIBLE);
}else{
to_btn.setVisibility(to_btn.GONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
引导页只在第一次使用 APP 的时候显示,以后启动 APP 显示【主页】。
- SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("user",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
if (sharedPreferences.getBoolean("if",false) == true){
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
startActivity(intent);
}else{
editor.putBoolean("if",true);
editor.commit();
}
切换到第三张图片时显示【开始使用】按钮,点击开始使用按钮,可以进入【主页】。
- View.setVisibility
- View.setVisibility(View.VISIBLE);//显示
- View.setVisibility(View.GONE);//隐藏
主页
- Okhttp
GET,POST
- POST
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("username","admin")
.add("password","123456")
.build();
Request request = new Request.Builder()
.url("https://mock.w2code.com/api/login")
.post(formBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("exc",e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String body = response.body().string();
Log.e("body",body);
try {
JSONObject jsonObject = new JSONObject(body);
JSONObject json = jsonObject.optJSONObject("data");
JSONObject json2 =json.optJSONObject("userInfo");
Log.e("data",json2.optString("username"));
//回到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
textView3.setText(json2.optString("username"));
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
- GET
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://124.93.196.45:10001//prod-api/api/rotation/list")
.get()
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e("e",e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String body = response.body().string();
Log.e("body",body);
try {
JSONObject jsonObject = new JSONObject(body);
String total = jsonObject.optString("total");
JSONArray jsonArray = jsonObject.getJSONArray("rows");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
Log.e("body", String.valueOf(jsonObject1.opt("createBy")));
if (String.valueOf(jsonObject1.opt("createBy")) != null){
//回到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
textView3.setText(String.valueOf(jsonObject1.opt("createBy")));
}
});
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
- JSON
JSONObject jsonObject = new JSONObject(body);
String total = jsonObject.optString("total");
JSONArray jsonArray = jsonObject.getJSONArray("rows");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
Log.e("body", String.valueOf(jsonObject1.opt("createBy")));
if (String.valueOf(jsonObject1.opt("createBy")) != null){
//回到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
textView3.setText(String.valueOf(jsonObject1.opt("createBy")));
}
});
}
设置图片
OkHttpClient client1 = new OkHttpClient();
Request request1 = new Request.Builder().get().url(imglaist.get(0)).build();
Call call1 = client1.newCall(request1);
call1.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
byte[] bytes = response.body().bytes();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView2.setImageBitmap(bitmap);
}
});
}
});
- Timer
//获得timer对象
Timer timer = new Timer();
//开启计时器
timer.schedule(new TimerTask() {
@Override
public void run() {
//内容
}
});
}
},0,3000);//设置定时器时间
}
- runOnUiThread
runOnUiThread(new Runnable() {
@SuppressLint("ResourceAsColor")
@Override
public void run() {
//内容
}
});
ETC 充值
点击“查询”按钮,显示账户余额,并弹出“查询成功”/“查询失败”的提示 点击“充值”按钮,显示“充值成功”/“充值失败”字样提示(网 络请求,假数据本题得 0 分)
Toast.makeText(getApplicationContext(),"ok",Toast.LENGTH_SHORT).show();
完成充值金额下拉框(100元、200元、300元)
//android.R.layout.simple_spinner_dropdown_item,android.R.layout.simple_spinner_item,是spinner自带样式
ArrayList<String> mon = new ArrayList<>();
mon.add("1号");
mon.add("2号");
mon.add("3号");
ArrayAdapter<String> cardidadapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item,mon);
cardidadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
cardid.setAdapter(cardidadapter);
cardid.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(ETCActivity.this,mon.get(position),Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
筛选功能需要实现单选、多选,不能出现三项都不选择的情况
//监听checkbox是否标记
checkBox.setOnCheckedChangeListener();
红绿灯管理
- 实现排序约束列表的显示,列表内容包括“路口升序、路口降序、红灯升序、红灯降序、黄灯升序、黄灯降序、绿灯升序和绿灯降序”8项。每缺少一项扣0.2分,最多扣1分
- 红绿灯信息使用表格进行排版(具备横线、竖线、表头)
//记住属性stretchColumns拉伸列!
<TableLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="10dp"
android:stretchColumns="*"
android:layout_weight="3"
>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="升序"
/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="降序"
/>
</TableRow>
</TableLayout>
数据分析
饼状图自定义View
package com.example.jz_1.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import com.example.jz_1.bean.ViewData;
import java.util.ArrayList;
public class MyView extends View {
private Paint paint;
private ArrayList<ViewData> viewDatas;
private int w;
private int h;
private RectF rectF;
public MyView(Context context) {
super(context);
//初始化画笔
initPaint();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
//初始化画笔
private void initPaint() {
paint = new Paint();
//颜色
paint.setColor(Color.WHITE);
//模式填充
paint.setStyle((Paint.Style.FILL));
paint.setTextSize(30);
//初始化区域
rectF = new RectF();
}
//设置数据
public void setData(ArrayList<ViewData> viewDatas){
this.viewDatas = viewDatas;
initData();//色织数据的百分度和角度
invalidate();//刷新UI
}
private void initData() {
float sumValue = 0; //数值和
for (int i = 0; i < viewDatas.size(); i++) {
ViewData viewData = viewDatas.get(i);
sumValue+=viewData.value;
}
for (ViewData data : viewDatas) {
float percentage = data.value/sumValue;//计算百分比
float angle = percentage * 360; //对应的角度
data.percentage =percentage;
data.angle = angle;
}
}
//确定View大小
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//获取宽高
this.w = w;
this.h = h;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(w/2,h/2);//将画布坐标圆点移到中心位置
float currentStarAngle = 0;
float r = (float)(Math.min(w,h)/2);
rectF.set(-r,-r,r,r);
for (int i = 0; i < viewDatas.size(); i++) {
ViewData viewData = viewDatas.get(i);
paint.setColor(viewData.color);
//绘制扇形(通过绘制圆弧)
canvas.drawArc(rectF, currentStarAngle, viewData.angle, true, paint);
//绘制扇形上文字
float textAngle = currentStarAngle + viewData.angle /2;
paint.setColor(Color.BLACK);
float x = (float)(r /2 *Math.cos(textAngle*Math.PI /180));
float y = (float)(r /2 *Math.sin(textAngle * Math.PI/180));
paint.setColor(Color.BLACK);
canvas.drawText(viewData.name,x,y,paint);
currentStarAngle +=viewData.angle;
}
}
}
自定义View参数
package com.example.jz_1.bean;
public class ViewData {
public String name;//名字
public int value; //数值
public int color;//颜色
public float percentage;//百分比
public float angle; //角度
public ViewData(int value, String name,int color) {
this.value = value;
this.name = name;
this.color=color;
}
}
Fragment切换
Fragment1 fragment1 = Fragment1.newInstance("视频","");
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.framelayout,fragment1).commit();
BottomNavigationView点击事件
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.item1:
//点击事件
break;
case R.id.item2:
//点击事件
break;
}
return true;
}
});
RecyclerView的Adapter
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyViewHolder> {
List<String> list;//数据
Context context;//上下文
public RecycleAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@NotNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
//View
View view = LayoutInflater.from(context).inflate(R.layout.item, null);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position) {
//设置数据
holder.textView.setText(list.get(position));
}
@Override
public int getItemCount() {
//长度
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
//找到组件
textView = itemView.findViewById(R.id.text_item);
}
}
}
RecycleAdapter除了需要setAdapter还需要setLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
recycle.setLayoutManager(linearLayoutManager);
//其他模式
// recycle.setLayoutManager(new GridLayoutManager(getApplicationContext(),2));
// recycle.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL));