android动态拼接生成界面 ,大量界面

if (mIntentFrom == FLAG_SHOW) {

mFourteenDateValueEt.setEnabled(false);

}

if (!TextUtils.isEmpty(formDetail.getuValue())) {

mFourteenDateValueEt.setText(formDetail.getuValue());

} else {

mFourteenDateValueEt.setText(TimeUtil.getCurDateStr());

}

mFourteenDateValueEt.setTag(formDetail.getTableDetailID());

mFourteenDateValueEt.setOnClickListener(this);

mTypeFourteenView.setTag(mType);

linearLayout.addView(mTypeFourteenView);

} else if (mType == ViewTypeUtil.item_view_type_fifteen) {// 时间格式

mTypeFifteenView = LayoutInflater.from(this).inflate(R.layout.item_type_three, null);

mFifteenDateKeyTv = (TextView) mTypeFifteenView.findViewById(R.id.tv_test_date_key);

mFifteenDateValueEt = (EditText) mTypeFifteenView.findViewById(R.id.et_test_date_value);

mFifteenDateValueEt.setTag(formDetail.getTableDetailID());

mFifteenDateKeyTv.setText(formDetail.getCaption());

if (mIntentFrom == FLAG_SHOW) {

mFifteenDateValueEt.setEnabled(false);

}

if (!TextUtils.isEmpty(formDetail.getuValue())) {

mFifteenDateValueEt.setText(formDetail.getuValue());

} else {

mFifteenDateValueEt.setText(TimeUtil.getStringTimeShort());

}

mFifteenDateValueEt.setTag(formDetail.getTableDetailID());

mFifteenDateValueEt.setOnClickListener(this);

mTypeFifteenView.setTag(mType);

linearLayout.addView(mTypeFifteenView);

} else if (mType == ViewTypeUtil.item_view_type_sixteen) {// 标签

mTypeSixteenView = LayoutInflater.from(this).inflate(R.layout.item_type_zero, null);

mItemSixteenFieldTv = (TextView) mTypeSixteenView.findViewById(R.id.item_zero_field_tv);

mItemSixteenValueEt = (EditText) mTypeSixteenView.findViewById(R.id.item_zero_value_et);

mItemSixteenValueEt.setEnabled(false);

mItemSixteenValueEt.setText(formDetail.getuValue());

mItemSixteenValueEt.setTag(formDetail.getTableDetailID());

mItemSixteenFieldTv.setText(formDetail.getCaption());

mTypeSixteenView.setTag(mType);

linearLayout.addView(mTypeSixteenView);

}

}

}

3.处理复杂控件

其实这个里面的复杂控件就两种,一种是列表 一种是组

给简单大家解释一下列表是什么意思:  大家看有的表格里面是多行多列的,意味着同样的字段数据 可能要添写多条。

那么对应在app里面   就是 这些字段放到了一起  做成了一个 组。  那么这些字段添加多条 就是 在组后面放了一个 + 号

点击+号  这个组 就增加一组 。所以这个带+号的字段 就是 列表字段。

组和 列表 处理起来相对来说非常麻烦。

1).子项数据获取

2).布局嵌套

3).点击事件单独处理

4)保存数据独立拼接

具体这些问题,我就不一一展开说了。大家倘若有做的,具体做的时候自然会体会到。

4.处理点击事件

界面拼接完成后 ,要处理控件里面的点击事件。做的时候就会发现  倘若界面出现同一个item布局  ,布局里面包含点击事件 ,正常给控件设置点击事件,会发现 点击控件的时候无法区分开每个点击事件

所以处理点击事件的时候:原理  就是先循环整体的大布局 ,找到里面的每一项小布局,然后单独处理每一项小布局里面的控件。

这样才能保证点击事件没有问题。

代码贴一下:

@Override

public void onClick(View v) {

if (v.getId() == R.id.content_iv) {// 范例

} else if (v.getId() == R.id.voice_iv) {// 语音

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_two) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

mVoice = new VoiceToWord(this, editText);

mVoice.GetWordFromVoice();

}

} else if (viewTag == ViewTypeUtil.item_view_type_thirteen || viewTag == ViewTypeUtil.item_view_type_ten) {

LinearLayout l = (LinearLayout) ((LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0)).getChildAt(1);

for (int j = 0; j < l.getChildCount(); j++) {

LinearLayout l_add = (LinearLayout) ((LinearLayout) l.getChildAt(j));

for (int k = 0; k < l_add.getChildCount(); k++) {

int viewTag_child = (int) l_add.getChildAt(k).getTag();

if (viewTag_child == ViewTypeUtil.item_view_type_two) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(k)).getChildAt(0);

EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

mVoice = new VoiceToWord(this, editText);

mVoice.GetWordFromVoice();

}

}

}

}

}

}

} else if (v.getId() == R.id.special_iv) {// 特殊字符

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_two) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

mSpecialdialog = new SpecialWordsDialog(context, editText);

}

} else if (viewTag == ViewTypeUtil.item_view_type_thirteen || viewTag == ViewTypeUtil.item_view_type_ten) {

LinearLayout l = (LinearLayout) ((LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0)).getChildAt(1);

for (int j = 0; j < l.getChildCount(); j++) {

LinearLayout l_add = (LinearLayout) ((LinearLayout) l.getChildAt(j));

for (int k = 0; k < l_add.getChildCount(); k++) {

int viewTag_child = (int) l_add.getChildAt(k).getTag();

if (viewTag_child == ViewTypeUtil.item_view_type_two) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(k)).getChildAt(0);

EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

mSpecialdialog = new SpecialWordsDialog(context, editText);

}

}

}

}

}

}

} else if (v.getId() == R.id.et_test_date_value) {// 时间选择

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_three) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlgByType(this, editText, 1);

}

} else if (viewTag == ViewTypeUtil.item_view_type_fourteen) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlg(this, editText);

}

} else if (viewTag == ViewTypeUtil.item_view_type_fifteen) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlgByType(this, editText, 2);

}

} else if (viewTag == ViewTypeUtil.item_view_type_thirteen || viewTag == ViewTypeUtil.item_view_type_ten) {

LinearLayout l = (LinearLayout) ((LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0)).getChildAt(1);

for (int j = 0; j < l.getChildCount(); j++) {

LinearLayout l_add = (LinearLayout) ((LinearLayout) l.getChildAt(j));

for (int k = 0; k < l_add.getChildCount(); k++) {

int viewTag_child = (int) l_add.getChildAt(k).getTag();

if (viewTag_child == ViewTypeUtil.item_view_type_three) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlgByType(this, editText, 1);

}

} else if (viewTag_child == ViewTypeUtil.item_view_type_fourteen) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlg(this, editText);

}

} else if (viewTag_child == ViewTypeUtil.item_view_type_fifteen) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(i)).getChildAt(0);

EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag().equals(editText.getTag())) {

DlgUtil.showDateTimePickerDlgByType(this, editText, 2);

}

}

}

}

}

}

} else if (v.getId() == R.id.et_select_value) {

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_five) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

final EditText editText = (EditText) l.getChildAt(1);

if (v.getTag(R.id.select_view_detial_id).equals(editText.getTag(R.id.select_view_detial_id))) {

int position = (int) editText.getTag(R.id.select_view_position);

mDataList.clear();

List dicList = mFormDetailList.get(position).dicBeanList;

for (DicBean dicBean : dicList) {

mDataList.add(dicBean.getDicName());

}

CusSpinerAdapter mAdapter = new CusSpinerAdapter(this);

mAdapter.refreshData(mDataList, 0);

View contentView = LayoutInflater.from(context).inflate(R.layout.common_form_view, null);

SpinerPopWindow mSpinerPopWindow = new SpinerPopWindow(this, R.layout.spiner_window_layout, true);

mSpinerPopWindow.setAdatper(mAdapter);

mSpinerPopWindow.setItemListener(new IOnItemSelectListener() {

@Override

public void onItemClick(int pos) {

if (pos >= 0 && pos <= mDataList.size()) {

String value = (String) mDataList.get(pos);

editText.setText(value.toString());

}

}

});

mSpinerPopWindow.setWidth(editText.getWidth());

int windowPos[] = PopMeasure.calculatePopWindowPos(editText, contentView);

int xOff = 25;// 可以自己调整偏移

windowPos[0] -= xOff;

mSpinerPopWindow.showAtLocation(v, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);

}

}else if(viewTag == ViewTypeUtil.item_view_type_thirteen || viewTag == ViewTypeUtil.item_view_type_ten){

LinearLayout l = (LinearLayout) ((LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0)).getChildAt(1);

for (int j = 0; j < l.getChildCount(); j++) {

LinearLayout l_add = (LinearLayout) ((LinearLayout) l.getChildAt(j));//第二层布局layout

for (int k = 0; k < l_add.getChildCount(); k++) {

int viewTag_child = (int) l_add.getChildAt(k).getTag();

if(viewTag_child == ViewTypeUtil.item_view_type_five){

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(k)).getChildAt(0);//第三层每一项

final EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag(R.id.select_view_detial_id).equals(editText.getTag(R.id.select_view_detial_id))) {

int position = (int) editText.getTag(R.id.select_view_position);

mDataList.clear();

List dicList = new ArrayList<FormDetailBean.FormDetail.DicBean>();

if (viewTag == ViewTypeUtil.item_view_type_ten) {

dicList = mFormDetailChildList.get(position).dicBeanList;

}else if (viewTag == ViewTypeUtil.item_view_type_thirteen) {

dicList = mFormZuDetailChildList.get(position).dicBeanList;

}

for (DicBean dicBean : dicList) {

mDataList.add(dicBean.getDicName());

}

CusSpinerAdapter mAdapter = new CusSpinerAdapter(this);

mAdapter.refreshData(mDataList, 0);

View contentView = LayoutInflater.from(context).inflate(R.layout.common_form_view, null);

SpinerPopWindow mSpinerPopWindow = new SpinerPopWindow(this, R.layout.spiner_window_layout, true);

mSpinerPopWindow.setAdatper(mAdapter);

mSpinerPopWindow.setItemListener(new IOnItemSelectListener() {

@Override

public void onItemClick(int pos) {

if (pos >= 0 && pos <= mDataList.size()) {

String value = (String) mDataList.get(pos);

editText.setText(value.toString());

}

}

});

mSpinerPopWindow.setWidth(editText.getWidth());

int windowPos[] = PopMeasure.calculatePopWindowPos(editText, contentView);

int xOff = 200;// 可以自己调整偏移

windowPos[0] -= xOff;

mSpinerPopWindow.showAtLocation(v, Gravity.TOP | Gravity.START,windowPos[0], windowPos[1]);

}

}else if(viewTag_child == ViewTypeUtil.item_view_type_thirteen || viewTag_child == ViewTypeUtil.item_view_type_ten){

LinearLayout l3 = (LinearLayout) ((LinearLayout) ((LinearLayout) l_add.getChildAt(k)).getChildAt(0)).getChildAt(1);

for (int j3 = 0; j3 < l3.getChildCount(); j3++) {

LinearLayout l_add3 = (LinearLayout) ((LinearLayout) l3.getChildAt(j3));

for (int k3 = 0; k3 < l_add3.getChildCount(); k3++) {

int viewTag_child3 = (int) l_add3.getChildAt(k3).getTag();

if(viewTag_child3 == ViewTypeUtil.item_view_type_five){

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add3.getChildAt(k3)).getChildAt(0);

final EditText editText = (EditText) l_view.getChildAt(1);

if (v.getTag(R.id.select_view_detial_id).equals(editText.getTag(R.id.select_view_detial_id))) {

int position = (int) editText.getTag(R.id.select_view_position);

mDataList.clear();

List dicList = mFormZuDetailChildList.get(position).dicBeanList;

for (DicBean dicBean : dicList) {

mDataList.add(dicBean.getDicName());

}

CusSpinerAdapter mAdapter = new CusSpinerAdapter(this);

mAdapter.refreshData(mDataList, 0);

View contentView = LayoutInflater.from(context).inflate(R.layout.common_form_view, null);

SpinerPopWindow mSpinerPopWindow = new SpinerPopWindow(this, R.layout.spiner_window_layout, true);

mSpinerPopWindow.setAdatper(mAdapter);

mSpinerPopWindow.setItemListener(new IOnItemSelectListener() {

@Override

public void onItemClick(int pos) {

if (pos >= 0 && pos <= mDataList.size()) {

String value = (String) mDataList.get(pos);

editText.setText(value.toString());

}

}

});

mSpinerPopWindow.setWidth(editText.getWidth());

int windowPos[] = PopMeasure.calculatePopWindowPos(editText, contentView);

int xOff = 200;// 可以自己调整偏移

windowPos[0] -= xOff;

mSpinerPopWindow.showAtLocation(v, Gravity.TOP | Gravity.START,windowPos[0], windowPos[1]);

}

}

}

}

}

}

}

}

}

} else if (v.getId() == R.id.et_select_part_value) {

CheckPart_Monomer_Activity.actionStartForResult(context, mPartSelectValueEt.getText().toString(), “”, “”, monomerId, CheckPart_Monomer_Activity.class);

} else if (v.getId() == R.id.cbx_type_nine) {// 类型9 多选框意向

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_nine) {

LinearLayout l = (LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0);

CheckBox checkBox = (CheckBox) l.getChildAt(1);

} else if (viewTag == ViewTypeUtil.item_view_type_thirteen || viewTag == ViewTypeUtil.item_view_type_ten) {

LinearLayout l = (LinearLayout) ((LinearLayout) ((LinearLayout) mMainView.getChildAt(i)).getChildAt(0)).getChildAt(1);

for (int j = 0; j < l.getChildCount(); j++) {

LinearLayout l_add = (LinearLayout) ((LinearLayout) l.getChildAt(j));

for (int k = 0; k < l_add.getChildCount(); k++) {

int viewTag_child = (int) l_add.getChildAt(k).getTag();

if (viewTag_child == ViewTypeUtil.item_view_type_nine) {

LinearLayout l_view = (LinearLayout) ((LinearLayout) l_add.getChildAt(k)).getChildAt(0);

CheckBox checkBox = (CheckBox) l_view.getChildAt(1);

}

}

}

}

}

} else if (v.getId() == R.id.item_eleven_value_et) {

for (int i = 0; i < mMainView.getChildCount(); i++) {

int viewTag = (int) mMainView.getChildAt(i).getTag();

if (viewTag == ViewTypeUtil.item_view_type_eleven) {

if (!TextUtils.isEmpty(mDrawingPath)) {

Intent intent = new Intent(CommonFormViewActivity.this, DrawingTypeActivity.class);

intent.putExtra(“drawingPath”, mDrawingPath);

intent.putExtra(“tableDetailID”, (String) v.getTag());

intent.putExtra(“intent_from”, FLAG_UPDATE);

if (mIntentFrom == FLAG_SHOW || mIntentFrom == FLAG_UPDATE) {// 查看,修改记录

intent.putExtra(“RecordId”, mUTableID);

}

startActivityForResult(intent, 11);

}

}

}

} else if (v.getId() == R.id.item_eleven_value_img_photo) {// 类型11图纸标准类型拍照按钮

mViewTypeFlag = ViewTypeUtil.item_view_type_eleven;

if (mCreateBmpFactory == null) {

mCreateBmpFactory = new CreateBmpFactory(CommonFormViewActivity.this);

}

mCreateBmpFactory.OpenCamera();

} else if (v.getId() == R.id.item_eleven_value_img_folder) {// 类型11图纸标准类型从图库选择

mViewTypeFlag = ViewTypeUtil.item_view_type_eleven;

FileSelect chosen = new FileSelect(CommonFormViewActivity.this);

chosen.setOnFileSelecteListener(new OnFileSelecteListener() {

@Override

public void onFileSelected(String filePath, String fileName) {

mDrawingPath = filePath;

mDrawingNameTv.setText(fileName);

Intent intent1 = new Intent(CommonFormViewActivity.this, DrawingTypeActivity.class);

intent1.putExtra(“drawingPath”, mDrawingPath);

intent1.putExtra(“tableDetailID”, (String) mDrawingNameTv.getTag());

intent1.putExtra(“intent_from”, FLAG_UPDATE);

if (mIntentFrom == FLAG_SHOW || mIntentFrom == FLAG_UPDATE) {// 查看,修改记录

intent1.putExtra(“RecordId”, mUTableID);

}

startActivityForResult(intent1, 11);

}

});

chosen.showChosenDialog();

} else if (v.getId() == R.id.item_twelve_value_path) {// 类型12 图片路径

} else if (v.getId() == R.id.item_twelve_value_img_photo) {// 类型12拍照

mViewTypeFlag = ViewTypeUtil.item_view_type_twelve;

mViewTag = v.getTag();

if (mCreateBmpFactory == null) {

mCreateBmpFactory = new CreateBmpFactory(CommonFormViewActivity.this);

}

mCreateBmpFactory.OpenCamera();

} else if (v.getId() == R.id.item_twelve_value_img_folder) {// 类型12

mViewTypeFlag = ViewTypeUtil.item_view_type_twelve;

mViewTag = v.getTag();

if (mCreateBmpFactory == null) {

mCreateBmpFactory = new CreateBmpFactory(CommonFormViewActivity.this);

}

mCreateBmpFactory.OpenGallery();

} else if (v.getId() == R.id.iv_type_ten_add) {

AddListChildView();

}

}

估计这么写看看都会头晕,因为这上面代码 里面除了处理正常的点击事件,还要处理列表和组  也就是 嵌套布局里面的点击事件。但是原理都是一样的。

就是循环布局找到 你点击的那个布局,那个控件…  如果是嵌套多级  就一级一级的找…

5.保存上传数据

我们这边保存处理的逻辑就是将界面上所有的数据都拼成一个JSONOject  里面套JSONArray和JSONObject ,反正就是根据自己的业务往里面套数据,这个数据组织起来稍微有一点点麻烦。

代码贴一下:

package com.jky.xmxtcommonlib.utils;

import org.json.JSONException;

import org.json.JSONObject;

import com.jky.xmxtcommonlib.R;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.LinearLayout;

import android.widget.RadioButton;

import android.widget.RadioGroup;

import android.widget.TextView;

/**

  • Created by zlw on 2017/6/13.

*/

public class GetViewValueUtil {

// 表格输入框取值方法

public static JSONObject getTypeZeroValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

EditText editText = (EditText) linearLayout.getChildAt(1);

String id = editText.getTag() + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

// 单行输入框取值方法

public static JSONObject getTypeOneValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

EditText editText = (EditText) linearLayout.getChildAt(1);

String id = editText.getTag() + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

// 多行输入框取值方法

public static JSONObject getTypeTwoValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

EditText editText = (EditText) linearLayout.getChildAt(1);

String id = editText.getTag() + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

// 时间选择框取值方法

public static JSONObject getTypeThreeValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

if(linearLayout !=null){

EditText editText = (EditText) linearLayout.getChildAt(1);

if(editText!=null){

String id = editText.getTag() + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

}else{

JSONObject json= new JSONObject();

return json;

}

} else {

JSONObject json= new JSONObject();

return json;

}

return jsonObject;

}

// 数值输入框取值方法

public static JSONObject getTypeFourValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

EditText editText = (EditText) linearLayout.getChildAt(1);

String id = editText.getTag() + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

// 下拉选择框取值方法

public static JSONObject getTypeFiveValue(LinearLayout linearLayout, JSONObject jsonObject) throws JSONException {

EditText editText = (EditText) linearLayout.getChildAt(1);

String id = editText.getTag(R.id.select_view_detial_id) + “”;

String str = editText.getText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

结尾

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

etText().toString().trim();

jsonObject.put(id + “”, str);

return jsonObject;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-FrUoIefl-1710509101114)]
[外链图片转存中…(img-iOTqBWFX-1710509101114)]
[外链图片转存中…(img-O9xxWM3m-1710509101115)]
[外链图片转存中…(img-WUa8nS8U-1710509101115)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-racnJZHE-1710509101115)]

结尾

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

[外链图片转存中…(img-mbul6iwW-1710509101116)]

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值