基础代码分析记录

151 阅读3分钟

侧滑栏

可以直接使用模板

image.png

也可使用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));