2024年Android最新Android 百度翻译API(详细步骤+源码),android社招面经

最后是今天给大家分享的一些独家干货:

【Android开发核心知识点笔记】

【Android思维脑图(技能树)】

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【Android高级架构视频学习资源】

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

需要这份系统化学习资料的朋友,可以戳这里获取

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

1. 修改外观与布局


既然是编码,首先我要改变主题的外观,作为颜值控,我不运行这个丑的软件在我的手机上运行,这个项目你现在运行看到的页面是很丑的,来看看有多丑。

在这里插入图片描述

要想软件过得去,页面总得带点绿,这就是Google的直男审美。下面我都要改成白色,并且去掉它默认的顶部ActionBar。找到styles.xml文件并打开,修改代码如下:

这里我将主题样式的颜色从原谅绿改成了白色,并且NoActionBar去掉动作栏。然后你再运行一下

在这里插入图片描述

emmm…怎么说呢,感觉怪怪的,不行,还得再改改。打开MainActivity,在onCreate中增加如下代码:

//设置亮色状态栏模式 systemUiVisibility在Android11中弃用了,可以尝试一下。

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

其实使用这段代码的时候应该先判断Android的版本,这个在Android6.0以上生效,不过这只是做测试,所以我就不做判断了,因为我的手机是10.0,但是在实际的开发中还是要做的,这就涉及到Android版本适配了,比较多复杂,网络上的文章比较多,自行搜索。好了,下面运行一下:

在这里插入图片描述

看到状态栏了,不过好像还少了点什么,打开activity_main.xml,修改后代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.andr oid.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:fitsSystemWindows=“true”

android:orientation=“vertical”

tools:context=“.MainActivity”>

<androidx.appcompat.widget.Toolbar

android:layout_width=“match_parent”

android:layout_height=“?attr/actionBarSize”

android:background=“#FFF”

android:elevation=“3dp”>

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“center”

android:text=“在线翻译”

android:textColor=“#000”

android:textSize=“18sp” />

</androidx.appcompat.widget.Toolbar>

再运行一下:

在这里插入图片描述

嗯,效果喜人,看上去就是辣么滴顺眼。然后我贴上完整的布局代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.andr oid.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:fitsSystemWindows=“true”

android:orientation=“vertical”

tools:context=“.MainActivity”>

<androidx.appcompat.widget.Toolbar

android:layout_width=“match_parent”

android:layout_height=“?attr/actionBarSize”

android:background=“#FFF”

android:elevation=“3dp”>

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“center”

android:text=“在线翻译”

android:textColor=“#000”

android:textSize=“18sp” />

</androidx.appcompat.widget.Toolbar>

<ScrollView

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:overScrollMode=“never”>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

android:padding=“20dp”>

<LinearLayout

android:id=“@+id/before_lay”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:background=“#FFF”

android:foreground=“@drawable/stroke_gray”>

<org.angmarch.views.NiceSpinner

android:id=“@+id/sp_language”

android:layout_width=“match_parent”

android:layout_height=“48dp”

app:arrowTint=“#000”

app:textTint=“#000” />

<LinearLayout

android:id=“@+id/after_lay”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:gravity=“center_vertical”

android:orientation=“horizontal”

android:visibility=“gone”>

<androidx.cardview.widget.CardView

android:layout_width=“0dp”

android:layout_height=“wrap_content”

android:layout_weight=“1”

android:background=“#FFF”

app:cardCornerRadius=“5dp”>

<TextView

android:id=“@+id/tv_from”

android:layout_width=“match_parent”

android:layout_height=“40dp”

android:background=“@drawable/stroke_black_radus”

android:gravity=“center”

android:textColor=“#000”

android:textSize=“14sp” />

</androidx.cardview.widget.CardView>

<ImageView

android:layout_width=“30dp”

android:layout_height=“30dp”

android:layout_marginLeft=“10dp”

android:layout_marginRight=“10dp”

android:src=“@mipmap/icon_change” />

<androidx.cardview.widget.CardView

android:layout_width=“0dp”

android:layout_height=“wrap_content”

android:layout_weight=“1”

android:background=“#FFF”

app:cardCornerRadius=“5dp”>

<TextView

android:id=“@+id/tv_to”

android:layout_width=“match_parent”

android:layout_height=“40dp”

android:background=“@drawable/stroke_black_radus”

android:gravity=“center”

android:textColor=“#000”

android:textSize=“14sp” />

</androidx.cardview.widget.CardView>

<RelativeLayout

android:layout_width=“match_parent”

android:layout_height=“150dp”

android:layout_marginTop=“20dp”

android:background=“#FFF”>

<EditText

android:id=“@+id/ed_content”

android:layout_width=“match_parent”

android:layout_height=“150dp”

android:background=“@drawable/stroke_gray”

android:gravity=“top”

android:hint=“请输入要翻译的文字内容”

android:maxLength=“6000”

android:paddingLeft=“10dp”

android:paddingTop=“10dp”

android:paddingRight=“30dp”

android:paddingBottom=“10dp”

android:textColor=“#000”

android:textColorLink=“#ABABAB”

android:textCursorDrawable=“@drawable/cursor_style” />

<ImageView

android:id=“@+id/iv_clear_tx”

android:layout_width=“20dp”

android:layout_height=“20dp”

android:layout_alignParentRight=“true”

android:layout_alignParentBottom=“true”

android:layout_marginRight=“8dp”

android:layout_marginBottom=“8dp”

android:src=“@mipmap/icon_delete”

android:visibility=“gone” />

<LinearLayout

android:visibility=“gone”

android:id=“@+id/result_lay”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“20dp”

android:orientation=“vertical”>

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“翻译结果”

android:textColor=“#000”

android:textSize=“14sp” />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“10dp”

android:background=“#FFF”

android:orientation=“vertical”>

<TextView

android:id=“@+id/tv_result”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:padding=“10dp”

android:textColor=“#000” />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:gravity=“right”

android:orientation=“horizontal”>

<ImageView

android:id=“@+id/iv_copy_tx”

android:layout_width=“24dp”

android:layout_height=“24dp”

android:layout_marginRight=“4dp”

android:layout_marginBottom=“4dp”

android:padding=“4dp”

android:src=“@mipmap/icon_copy” />

<androidx.cardview.widget.CardView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“20dp”

android:background=“#FFF”

app:cardCornerRadius=“5dp”>

<TextView

android:id=“@+id/tv_translation”

android:layout_width=“match_parent”

android:layout_height=“48dp”

android:background=“@drawable/stroke_black_radus”

android:foreground=“?android:attr/selectableItemBackground”

android:gravity=“center”

android:padding=“10dp”

android:text=“翻译”

android:textColor=“#000”

android:textColorLink=“#ABABAB”

android:textSize=“16sp” />

</androidx.cardview.widget.CardView>

这个布局里面,我现在隐藏了两块区域。第一块是翻译后的语言区域,第二块是翻译后的结果区域。运行的效果如下:

在这里插入图片描述

2. 初始化控件


在MainActivity中,声明变量

private LinearLayout beforeLay;//翻译之前的布局

private NiceSpinner spLanguage;//语言选择下拉框

private LinearLayout afterLay;//翻译之后的布局

private TextView tvFrom;//翻译源语言

private TextView tvTo;//翻译目标语言

private EditText edContent;//输入框(要翻译的内容)

private ImageView ivClearTx;//清空输入框按钮

private TextView tvTranslation;//翻译

private LinearLayout resultLay;//翻译结果布局

private TextView tvResult;//翻译的结果

private ImageView ivCopyTx;//复制翻译的结果

private String fromLanguage = “auto”;//目标语言

private String toLanguage = “auto”;//翻译语言

private ClipboardManager myClipboard;//复制文本

private ClipData myClip; //剪辑数据

private String appId = “20201125000625305”;//APP ID 来源于百度翻译平台 请使用自己的

private String key = “6vjmDnNxypmebgbzKxul”;//秘钥 来源于百度翻译平台 请使用自己的

//配置初始数据

private List data = new LinkedList<>(Arrays.asList(

“自动检测语言”, “中文 → 英文”, “英文 → 中文”,

“中文 → 繁体中文”, “中文 → 粤语”, “中文 → 日语”,

“中文 → 韩语”, “中文 → 法语”, “中文 → 俄语”,

“中文 → 阿拉伯语”, "中文 → 西班牙语 ", “中文 → 意大利语”));

然后新写一个initView的方法。在这里对控件进行初始化并给予点击事件,并且数据赋值,

/**

  • 初始化控件视图

*/

private void initView() {

//设置亮色状态栏模式 systemUiVisibility在Android11中弃用了,可以尝试一下。

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

//控件初始化

beforeLay = findViewById(R.id.before_lay);

spLanguage = findViewById(R.id.sp_language);

afterLay = findViewById(R.id.after_lay);

tvFrom = findViewById(R.id.tv_from);

tvTo = findViewById(R.id.tv_to);

edContent = findViewById(R.id.ed_content);

ivClearTx = findViewById(R.id.iv_clear_tx);

tvTranslation = findViewById(R.id.tv_translation);

resultLay = findViewById(R.id.result_lay);

tvResult = findViewById(R.id.tv_result);

ivCopyTx = findViewById(R.id.iv_copy_tx);

//点击时间

ivClearTx.setOnClickListener(this);

ivCopyTx.setOnClickListener(this);

tvTranslation.setOnClickListener(this);

//设置下拉数据

spLanguage.attachDataSource(data);

editTextListener();//输入框监听

spinnerListener();//下拉框选择监听

//获取系统粘贴板服务

myClipboard = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE);

}

3. 输入框监听


editTextListener方法代码:

/**

  • 输入监听

*/

private void editTextListener() {

edContent.addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

ivClearTx.setVisibility(View.VISIBLE);//显示清除按钮

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

ivClearTx.setVisibility(View.VISIBLE);//显示清除按钮

}

@Override

public void afterTextChanged(Editable s) {

ivClearTx.setVisibility(View.VISIBLE);//显示清除按钮

String content = edContent.getText().toString().trim();

if (content.isEmpty()) {//为空

resultLay.setVisibility(View.GONE);

tvTranslation.setVisibility(View.VISIBLE);

beforeLay.setVisibility(View.VISIBLE);

afterLay.setVisibility(View.GONE);

ivClearTx.setVisibility(View.GONE);

}

}

});

}

4. 语言选择监听


spinnerListener方法代码如下:

/**

  • 语言类型选择

*/

private void spinnerListener() {

spLanguage.setOnSpinnerItemSelectedListener(new OnSpinnerItemSelectedListener() {

@Override

public void onItemSelected(NiceSpinner parent, View view, int position, long id) {

switch (position) {

case 0://自动检测

fromLanguage = “auto”;

toLanguage = fromLanguage;

break;

case 1://中文 → 英文

fromLanguage = “zh”;

toLanguage = “en”;

break;

case 2://英文 → 中文

fromLanguage = “en”;

toLanguage = “zh”;

break;

case 3://中文 → 繁体中文

fromLanguage = “zh”;

toLanguage = “cht”;

break;

case 4://中文 → 粤语

fromLanguage = “zh”;

toLanguage = “yue”;

break;

case 5://中文 → 日语

fromLanguage = “zh”;

toLanguage = “jp”;

break;

case 6://中文 → 韩语

fromLanguage = “zh”;

toLanguage = “kor”;

break;

case 7://中文 → 法语

fromLanguage = “zh”;

toLanguage = “fra”;

break;

case 8://中文 → 俄语

fromLanguage = “zh”;

toLanguage = “ru”;

break;

case 9://中文 → 阿拉伯语

fromLanguage = “zh”;

toLanguage = “ara”;

break;

case 10://中文 → 西班牙语

fromLanguage = “zh”;

toLanguage = “spa”;

break;

case 11://中文 → 意大利语

fromLanguage = “zh”;

toLanguage = “it”;

break;

default:

break;

}

}

});

}

5. 页面点击事件


同时要实现点击事件的监听,

在这里插入图片描述

鼠标点击这一行代码,然后使用快捷键,Alt + 回车

在这里插入图片描述

选择第一项,然后回车

在这里插入图片描述

点击OK,之后会重写onClick方法。这里不止一个控件,所以要根据view的id来判断才行。

/**

  • 页面点击事件

  • @param v

*/

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.iv_clear_tx://清空输入框

edContent.setText(“”);//清除文本

ivClearTx.setVisibility(View.GONE);//清除数据之后隐藏按钮

break;

case R.id.iv_copy_tx://复制翻译后的结果

String inviteCode = tvResult.getText().toString();

myClip = ClipData.newPlainText(“text”, inviteCode);

myClipboard.setPrimaryClip(myClip);

showMsg(“已复制”);

break;

case R.id.tv_translation://翻译

translation();//翻译

break;

default:

break;

}

}

/**

  • Toast提示

  • @param msg

*/

private void showMsg(String msg) {

Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();

}

下面重点来看看这个翻译的方法,这里面的东西还挺多的。

6. 翻译


既然是翻译首先获取到输入的文字,如下所示:

/**

  • 翻译

*/

private void translation() {

//获取输入的内容

String inputTx = edContent.getText().toString().trim();

//判断输入内容是否为空

if (!inputTx.isEmpty() || !“”.equals(inputTx)) {//不为空

tvTranslation.setText(“翻译中…”);

tvTranslation.setEnabled(false);//不可更改,同样就无法点击

String salt = num(1);//随机数

//拼接一个字符串然后加密

String spliceStr = appId + inputTx + salt + key;//根据百度要求 拼接

String sign = stringToMD5(spliceStr);//将拼接好的字符串进行MD5加密 作为一个标识

//异步Get请求访问网络

asyncGet(inputTx, fromLanguage, toLanguage, salt, sign);

} else {//为空

showMsg(“请输入要翻译的内容!”);

}

}

这里先判断了输入框的值是否为null或者“”,不是则改变翻译按钮的文字显示,并且不可点击,给用户一种正在翻译的假象。之后就是生成一个随机数,这个是按照百度的要求来的,方法很简单,就不过多解释了。

/**

  • 随机数 (根据百度的要求需要一个随机数)

*/

public static String num(int a) {

Random r = new Random(a);

int ran1 = 0;

for (int i = 0; i < 5; i++) {

ran1 = r.nextInt(100);

System.out.println(ran1);

}

return String.valueOf(ran1);

}

然后拼接一个字符串spliceStr,然后通过md5进行小写加密,加密后的值也是作为访问百度翻译API的一个参数。加密方法如下:

/**

  • 将字符串转成MD5值

  • @param string 需要加密的内容

  • @return 加密后的字符串

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图



里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

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

需要这份系统化学习资料的朋友,可以戳这里获取

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

n = stringToMD5(spliceStr);//将拼接好的字符串进行MD5加密 作为一个标识

//异步Get请求访问网络

asyncGet(inputTx, fromLanguage, toLanguage, salt, sign);

} else {//为空

showMsg(“请输入要翻译的内容!”);

}

}

这里先判断了输入框的值是否为null或者“”,不是则改变翻译按钮的文字显示,并且不可点击,给用户一种正在翻译的假象。之后就是生成一个随机数,这个是按照百度的要求来的,方法很简单,就不过多解释了。

/**

  • 随机数 (根据百度的要求需要一个随机数)

*/

public static String num(int a) {

Random r = new Random(a);

int ran1 = 0;

for (int i = 0; i < 5; i++) {

ran1 = r.nextInt(100);

System.out.println(ran1);

}

return String.valueOf(ran1);

}

然后拼接一个字符串spliceStr,然后通过md5进行小写加密,加密后的值也是作为访问百度翻译API的一个参数。加密方法如下:

/**

  • 将字符串转成MD5值

  • @param string 需要加密的内容

  • @return 加密后的字符串

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图

[外链图片转存中…(img-h9RdqQzC-1715651525692)]
[外链图片转存中…(img-zDHiipxw-1715651525693)]
里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

[外链图片转存中…(img-FYCR3VP7-1715651525693)]

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

需要这份系统化学习资料的朋友,可以戳这里获取

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值