Android 文本,软键盘使用指南_android 软件盘英文,如何准备大厂面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

public class MImageGetter implements ImageGetter {
Context c;
public MImageGetter(TextView text, Context c) {
this.c = c;
}
public Drawable getDrawable(String source) {
Drawable drawable = null;
InputStream is = null;
try {
is = c.getResources().getAssets().open(source);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
TypedValue typedValue = new TypedValue();
typedValue.density = TypedValue.DENSITY_DEFAULT;
drawable = Drawable.createFromResourceStream(null, typedValue, is, “src”);
DisplayMetrics dm = c.getResources().getDisplayMetrics();
int dwidth = dm.widthPixels-10;//padding left + padding right
float dheight = (float)drawable.getIntrinsicHeight()*(float)dwidth/(float)drawable.getIntrinsicWidth();
int dh = (int)(dheight+0.5);
int wid = dwidth;
int hei = dh;
drawable.setBounds(0, 0, wid, hei);
return drawable;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
}

EditText的基本使用

1. EditText的基本属性

<EditText
android:textIsSelectable=“true” //文本是否可选,复制粘贴剪辑,在TextVew中使用,在EditText中使用此属性将收不到软键盘输入内容
android:id=“@+id/pop_select_label_et”
android:layout_weight=“1”
android:paddingLeft=“25dp”
android:background=“@drawable/find_num_tv_bg”//@null 取消下划线
android:hint=“输入话题”
android:maxLength=“30”
android:textColorHint=“@color/white”
android:textColor=“@color/white”
android:singleLine=“true”
android:imeOptions=“actionSearch”//软键盘右下方修改为搜索
android:layout_width=“0dp”
android:textCursorDrawable=“@drawable/text_view_cursor” //修改光标的颜色
android:textSize=“15sp”
android:cursorVisible=“false”//是否显示光标
android:focusable=“true”//是否可以focu
android:layout_height=“match_parent”
/>

1. imeOption属性

imeOptions:值:

  • actionDone:完成,对应常量EditorInfo.IME_ACTION_DONE
  • actionSend :发送,对应常量EditorInfo.IME_ACTION_SEND
  • actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH
  • actionGo 去往,对应常量EditorInfo.IME_ACTION_GO
  • actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE
  • actionUnspecified 未指定,默认,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.
  • actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT
2. inputType属性

android:inputType=“phone” //电话号码
android:inputType=“none”
//文本类型,多为大写、小写和数字符号。
android:inputType=“text”
android:inputType=“textCapCharacters” //字母大写
android:inputType=“textCapWords” //首字母大写
android:inputType=“textCapSentences” //仅第一个字母大写
android:inputType=“textAutoCorrect” //自动完成
android:inputType=“textAutoComplete” //自动完成
android:inputType=“textMultiLine” //多行输入
android:inputType=“textImeMultiLine” //输入法多行(如果支持)
android:inputType=“textNoSuggestions” //不提示
android:inputType=“textUri” //网址
android:inputType=“textEmailAddress” //电子邮件地址
android:inputType=“textEmailSubject” //邮件主题
android:inputType=“textShortMessage” //短讯
android:inputType=“textLongMessage” //长信息
android:inputType=“textPersonName” //人名
android:inputType=“textPostalAddress” //地址
android:inputType=“textPassword” //密码
android:inputType=“textVisiblePassword” //可见密码
android:inputType=“textWebEditText” //作为网页表单的文本
android:inputType=“textFilter” //文本筛选过滤
android:inputType=“textPhonetic” //拼音输入

//数值类型
android:inputType=“number” //数字
android:inputType=“numberSigned” //带符号数字格式
android:inputType=“numberDecimal” //带小数点的浮点格式
android:inputType=“datetime” //时间日期
android:inputType=“date” //日期键盘
android:inputType=“time” //时间键盘

2. 监听软键盘右下角按键

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
switch (actionId){
case EditorInfo.IME_ACTION_SEARCH:
break;
case EditorInfo.IME_ACTION_DONE:
break;
case EditorInfo.IME_ACTION_SEND:
break;
case EditorInfo.IME_ACTION_GO:
break;
case EditorInfo.IME_ACTION_NONE:
break;
case EditorInfo.IME_ACTION_NEXT:
break;
case EditorInfo.IME_ACTION_UNSPECIFIED:
break;
}
return false;
}
});

3. 设置imeOption不生效的解决办法

设置imeOption无效:需要将singleLine设置为true或者 将inputType设置为text

2. 修改EditText下划线的颜色

//1. 通过修改colorAccent属性来修改下划线颜色,此方法会全局修改
@color/colorWhite80

//2. 通过修改EditText的style来修改下划线颜色

3. 控制输入框最多输入20个字符(10个汉字,20个英文字符)

Android原生计算方法没有汉字和英文字符的区分,所以当产品有这个需求的时候,只能通过过滤计算去限制输入!这里提供两种方案:

1. 通过TextWatcher来监听输入字符串内容进行过滤

editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int charSequenceCount = countChineseChar(s);
if (s.length() + charSequenceCount > StaticFinalValues.MAX_CHAR_NUM_SELECT) {
CharSequence text = s.subSequence(0, s.length() - 1);
editText.setText(text);
editText.setSelection(text.length());//光标跳最后
if(System.currentTimeMillis() - mLastTime > 500) {
Toast.makeText(mContext, “输入不能多于” + String.valueOf( StaticFinalValues.MAX_CHAR_NUM_SELECT) +“字符”, Toast.LENGTH_SHORT).show();
mLastTime = System.currentTimeMillis();
}
return;
}
}
});

/**

  • 计算中文字符
  • @param sequence
  • @return
    /
    public static int countChineseChar(CharSequence sequence) {
    if (TextUtils.isEmpty(sequence)) {
    return 0;
    }
    int charNum = 0;
    for (int i = 0; i < sequence.length(); i++) {
    char word = sequence.charAt(i);
    if (UiUtils.isChineseChar(word)) {//中文
    charNum++;
    }
    }
    return charNum;
    }
    /
    *
  • 判断是否是中文
  • @param c
  • @return
    */
    public static boolean isChineseChar(char c) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of©;
    if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
    || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
    || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
    || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
    return true;
    }
    return false;
    }
2. 通过实现InputFileter来过滤,中文算两个字符,英文算一个

public class MaxLengthEditText extends AppCompatEditText {
public MaxLengthEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initLength(attrs,context);
}
public MaxLengthEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initLength(attrs,context);
}
private void initLength(AttributeSet a, Context context) {
//命名空间(别告诉我不熟悉)
String namespace = “http://schemas.android.com/apk/res/android”;
//获取属性中设置的最大长度
int maxLength = a.getAttributeIntValue(namespace, “maxLength”, -1);
//如果设置了最大长度,给出相应的处理
if (maxLength > -1) {
setFilters(new InputFilter[]{new MaxLengthEditText.MyLengthFilter(maxLength,context)});
}
}
/**

  • 从源码中复制出来的
  • 来源:InputFilter.LengthFilter
  • 这里只是添加了一句话:
  •          Toast.makeText(context, "字数不能超过" + mMax, Toast.LENGTH_SHORT).show();
    
  • This filter will constrain edits not to make the length of the text
  • greater than the specified length.
    */
    class MyLengthFilter implements InputFilter {

private final int mMax;
private Context context;

public MyLengthFilter(int max, Context context) {
mMax = max;
this.context = context;
}

public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
int keep = 0;
for (int i = 0; i < dest.length(); i++) {
char charAt = dest.charAt(i);
//32-122包含了空格,大小写字母,数字和一些常用的符号,
//如果在这个范围内则算一个字符,
//如果不在这个范围比如是汉字的话就是两个字符
if (charAt >= 32 && charAt <= 122) {
keep++;
} else {
keep += 2;
}
}
if(keep <= mMax){
return source.subSequence(start, source.length());
}else{
Toast.makeText(mContext, “输入少一点,太多了”, Toast.LENGTH_SHORT).show();
return “”;
}
}
/**

  • @return the maximum length enforced by this input filter
    */
    public int getMax() {
    return mMax;
    }
    }
    }

4. 判断软键盘输入的是否有表情

若需求声明,表情只能算一个字符,这时候就需要在输入后进行判断:

@Override
public void afterTextChanged(Editable s) {
String s1 = s.toString();
char[] sC = new char[s1.length()];
s1.getChars(0,s1.length(),sC,0);
for (char c : sC) {
Log.e(TAG, "afterTextChanged: "+ isEmojiCharacter©);
}
}

private static boolean isEmojiCharacter(char codePoint) {
return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && codePoint <= 0xD7FF))|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}

软键盘全解

Activity的SoftInputMethod参数讲解

属性作用
stateUnspecified未指定状态,系统默认采用的交互方式,默认不弹出软键盘,但是对于输入框界面有滚动布局时且EditText获得焦点时,软键盘弹出
stateUnchanged状态不改变 ,当前界面的软键盘是否显示,取决于上一个Activity软键盘的状态
stateHidden软键盘一定是隐藏
stateAlwaysHidden软键盘一定是隐藏,暂时没发现和stateHidden有啥区别
stateVisible设置为这个属性,可以将软键盘召唤出来,即使在界面上没有输入框的情况下也可以强制召唤出来
stateAlwaysVisible软键盘默认显示,当给AActivity设置stateVisible属性时,从当前AActivity跳转到BActivity,软键盘隐藏,再从BActivity返回AActivity,软键盘不显示!当设置stateAlwaysVisible属性时,跳转后的返回软键盘依旧显示!
adjustUnspecified系统默认属性,默认adjustPan的效果!如果在设置这个属性之前设置过adjustResize,则会是adjustResize的效果!如果上一次设置为adjustPan,再设置为adjustUnspecified,则会是adjustPan的效果!
adjustResize设置这个属性,当前Activity总会给软键盘预留显示空间,输入框被弹出软键盘覆盖掉,有两种情况:1. 有滚动布局,其他布局不移动且大小不改变,输入框移动到软键盘上面 2. 无滚动布局,通过修改其他布局的大小达到输入框移动到软键盘的效果
adjustPan设置这个属性,Activity不会预留软键盘显示空间,而是通过布局移动来保证输入框不被软键盘覆盖!只要输入框被软键盘覆盖,就会通过移动整个布局来达到显示输入框的效果!
注意当Activity设置全屏后,adjustResize和adjustPan没有任何区别!无论是否有滚动布局,Activity都会往上移动

软键盘的隐藏,显示,及判断是否显示工具类

public class AppKeyBoardMgr {
/**

  • 打开软键盘
  • @param mEditText 输入框
  • @param mContext 上下文
    */
    public static void openKeybord(EditText mEditText, Context mContext)
    {
    InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

/**

  • 显示输入法
  • @param mAct activity
    */
    public static void showInputMethod(final Activity mAct) {
    View v = mAct.getCurrentFocus();
    if (null == v) {
    return;
    }
    ((InputMethodManager) mAct.getSystemService(Activity.INPUT_METHOD_SERVICE)).showSoftInput(v, 0);
    }

/**

  • 强制显示输入法键盘
    */
    public static void showKeybord(EditText edittext) {
    InputMethodManager inputMethodManager = (InputMethodManager)
    edittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_FORCED);
    }

/**

  • 关闭软键盘
  • @param mEditText 输入框
  • @param mContext 上下文
    /
    public static void closeKeybord(EditText mEditText, Context mContext)
    {
    InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
    }
    /
    *
  • 强制隐藏输入法键盘
    */
    public static void hideKeybord(EditText edittext) {
    InputMethodManager inputMethodManager = (InputMethodManager)
    edittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager.isActive()) {
    inputMethodManager.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
    }
    }

/**

  • 隐藏输入法
  • @param mAct activity
    /
    public static void hideInputMethod(Activity mAct) {
    try {// hide keybord anyway
    View v = mAct.getWindow().getCurrentFocus();
    if (v != null) {
    InputMethodManager imm = (InputMethodManager) mAct.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
    } catch (Exception e) {
    }
    }
    /
    *
  • 通过定时器强制隐藏虚拟键盘
    */
    public static void TimerHideKeyboard(final View v) {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
    @Override
    public void run() {
    InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm.isActive()) {
    imm.hideSoftInputFromWindow(v.getApplicationWindowToken(),0);
    }
    }
    }, 10);
    }

/**

  • 切换软键盘的状态
  • 如当前为收起变为弹出,若当前为弹出变为收起
    /
    public static void toggleKeybord(EditText edittext) {
    InputMethodManager inputMethodManager = (InputMethodManager)
    edittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    }
    /
    *
  • 输入法是否显示
    */
    public static boolean isKeybord(EditText edittext) {
    boolean bool = false;
    InputMethodManager inputMethodManager = (InputMethodManager)
    edittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager.isActive()) {
    bool = true;
    }
    return bool;
    }
    }

软键盘弹出监听及高度获取

Android系统没有对软键盘做特别的开放监听接口,一般情况下我们可以通过布局的addOnGlobalLayoutListener接口来获取软键盘是否显示的监听!

提别提醒:如果设置了属性adjustNothing,布局没有任何改变,addOnGlobalLayoutListener这个监听是不会有回调的!

特别说明:下面计算软键盘高度通过两种方式来获取,为了兼容,这里采用两种方式取最小值来获取软键盘高度,一种是通过反射系统方法getInputMethodWindowVisibleHeight()方法来获取软键盘高度,一种通过计算布局显示高度来确认软键盘高度!

//拿到当前XML文件的根布局
mChildContent = (FrameLayout) findViewById(android.R.id.content);
//监听当前View的状态,进行通知回调,即"软键盘弹出""
View childew = mChildContent.getChildAt(0);
childew.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//反射获取
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
int injectSoftHeight = 0;
try {
Method method = inputMethodManager.getClass().getDeclaredMethod(“getInputMethodWindowVisibleHeight”, null);
method.setAccessible(true);
injectSoftHeight = (Integer) method.invoke(inputMethodManager, null);
} catch (Exception e) {
e.printStackTrace();
}
//布局显示高度差来计算
View decorView = getWindow().getDecorView();
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
decorView.getWindowVisibleDisplayFrame®;
int rootHeight = decorView.getRootView().getHeight();
int rH = r.bottom - r.top;
int measureDVHeight = rootHeight - rH;

if (injectSoftHeight > 200) {
mMeasureSoftKBHeight = injectSoftHeight < measureDVHeight ? injectSoftHeight : measureDVHeight;
} else if (injectSoftHeight <= 200) {
mMeasureSoftKBHeight = measureDVHeight;
}

if (mLastHeight != mMeasureSoftKBHeight) {
if (mMeasureSoftKBHeight > 200) {//200这个值视情况而定,目前设置这个值没有出现兼容问题
//软键盘显示
} else {
//软键盘隐藏
}
mLastHeight = mMeasureSoftKBHeight;
}
}
});

软键盘常见问题

非全屏模式下软键盘覆盖输入框,做背景不动,软键盘上移效果

这种情况,直接通过设置带滚动布局,设置adjustResize属性就可以实现效果

全屏模式下软键盘覆盖输入框的问题,做背景不动,软键盘上移效果
1. 第一种思路:获取软键盘高度后修改父布局的高度
思路介绍图

思路参考于:AndroidBug5497Workaround

代码实现

//思路参考于:AndroidBug5497Workaround
public class AndroidSoftBoardAdjustHeightUtil {

public static void assistActivity(Activity activity) {
new AndroidSoftBoardAdjustHeightUtil(activity);
}

private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private AndroidSoftBoardAdjustHeightUtil(Activity activity) {
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
possiblyResizeChildOfContent();
}
});
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious) {
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
//排除其他View引起的变化,专注软键盘变化
if (heightDifference > (usableHeightSansKeyboard / 4)) {
// keyboard probably just became visible
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; //减掉软键盘的高度
} else {
// keyboard probably just became hidden
frameLayoutParams.height = usableHeightSansKeyboard;
}
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}

private int computeUsableHeight() {
Rect r = new Rect();
//这行代码能够获取到去除标题栏和被软键盘挡住的部分,所剩下的矩形区域
mChildOfContent.getWindowVisibleDisplayFrame®;
//r.top : 标题栏的高度
//屏幕高度-r.bottom : 软键盘的高度
//可用高度(全屏模式) : rect.bottom
//可用高度(非全屏模式) : rect.bottom - rect.top
return (r.bottom - r.top);// 全屏模式下: return r.bottom
}

}

2. 第二种思路:通过添加占位图的方式将输入框上移
思路介绍图

由于第一种方式会有兼容问题,而且软键盘弹出的时候部分手机会出现闪烁现象!

  1. 通过设置下图中的PlaceholderView的Visible和Gone来控制EditText的高度

代码
  1. 在输入框onTouch事件的时候将占位视图显示出来,防止闪烁问题
  2. 在监听到软键盘弹出之后,通过视图的偏移高度和反射调用getInputMethodWindowVisibleHeight获取软键盘高度取最小值!(为了适配手机虚拟键盘高度计算,本人自测,任何一种方式都不能兼容到所有手机,最终通过取两种计算结果下的最小值来解决这个问题!)

private void initCheckKeyBoardIsShow(final EditText editText) {
editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.setCursorVisible(true);
mPlaceholderTv.setVisibility(View.VISIBLE);
return false;
}
});
//拿到当前XML文件的根布局
mChildContent = (FrameLayout) findViewById(android.R.id.content);

//监听当前View的状态,进行通知回调,即"软键盘弹出""
View childew = mChildContent.getChildAt(0);
childew.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
int injectSoftHeight = 0;
try {
Method method = inputMethodManager.getClass().getDeclaredMethod(“getInputMethodWindowVisibleHeight”, null);

推荐学习资料

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BAT TMD大厂Android高频面试题

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

dManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
int injectSoftHeight = 0;
try {
Method method = inputMethodManager.getClass().getDeclaredMethod(“getInputMethodWindowVisibleHeight”, null);

推荐学习资料

  • Android进阶学习全套手册

[外链图片转存中…(img-7qgFmuao-1713680125891)]

  • Android对标阿里P7学习视频

[外链图片转存中…(img-7DpUStjw-1713680125891)]

  • BAT TMD大厂Android高频面试题

[外链图片转存中…(img-BLROgoBX-1713680125892)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-6vkW6exx-1713680125892)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值