当前位置:   article > 正文

Android Studio实现计算器(kotlin语言)_android studio写的比较完备的计算器功能

android studio写的比较完备的计算器功能

先介绍整体逻辑:

需要注意的约束:(自己写的不一定全面)

1. 小数点要能在没有数字的时候直接作为一个小数的开头输入;

2. 小数点可以作为一个小数的结尾;

3. 运算符后不能紧跟运算符;

4. 运算符前可以有数字、小数点、右括号;

5. 负数的符号限制在左括号之后或者表达式开头;

6. 右括号的插入必须是在当前表达式左括号的数量比右括号数量多的情况;

7. 小数点不能出现在一个数中两次;

8. 左括号之前必须有运算符或者表达式为空;

9. 运算符不能作为表达式开头除了负号。

展示注意的事情:

1. 表达式展示需要注意显示的长度,如果过长会自动出现“...”在编辑框中,不太美观;

2. 结果展示保留了10位小数,可以处理一些3-3.3的计算问题;对科学计数法保留了6为小数,因为输出框太小了显示不全。

计算器运行方式:

1. 先将表达式字符串中的操作数和运算符、括号等全部保存到一个列表中;

2.使用两个栈运算表达式的方法相信各位大佬都会,所以就不提了。

本计算器会实时给出当前表达式的运算结果,如果点击等号,就会在使用结果覆盖表达式。

MainActivity.kt代码:(其中的click是一个音频文件存放在res/raw目录下)

  1. import android.media.MediaPlayer
  2. import androidx.appcompat.app.AppCompatActivity
  3. import android.os.Bundle
  4. import android.util.Log
  5. import android.widget.Button
  6. import android.widget.TextView
  7. import kotlin.math.round
  8. class Value(var flag: Boolean, var value: Double)
  9. class valueSign(var flag: Boolean, var value: Double, var sign: Char='0')
  10. class MainActivity : AppCompatActivity() {
  11. val sign = arrayListOf<Char>('+', '-', 'x', '/', '.', ')', '(', '%')
  12. val sign_ = arrayListOf<Char>('+', '-', 'x', '/', ')', '(', '%')
  13. val sign__ = arrayListOf<Char>('+', '-', 'x', '/', '(', '%')
  14. var gs = ""
  15. val len_1 = 9
  16. // 判断是否可以插入符号
  17. fun judgeInsertSign(text: String, ch: Char): Boolean {
  18. if (ch == '-' && (text == "" || text[text.length-1] == '(')) return true // 可以插入-号判断
  19. if (ch == ')') {
  20. var cnt = 0
  21. for (i in text) {
  22. if (i == '(') cnt += 1
  23. else if (i == ')') cnt -= 1
  24. }
  25. if (cnt < 1) return false
  26. } // 不可以插入右括号判断
  27. if (ch == '.' && text != "") {
  28. for (i in text.length-1 downTo 0) {
  29. if (text[i] in sign) {
  30. if (text[i] == '.') return false
  31. else break
  32. }
  33. }
  34. } // 不可以插入.判断
  35. if (ch == '.' && (text == "" || text[text.length-1] in sign__)) {
  36. return true
  37. } // 可以插入.判断
  38. if (text.length >= 2 && ch in sign__ && ch != '(' && text[text.length-1] == '.' && !(text[text.length-2] in sign)) {
  39. return true
  40. } // 可以在小数点后面插入运算符
  41. if (ch == '(' && (text == "" || text[text.length-1] in sign__)) { // 是否可以插入左括号判断
  42. return true
  43. }
  44. else if (ch == '(') return false
  45. if (text != "" && text[text.length-1] == ')' && ch != '(' && ch != '.') { // 给出可以插入的普通情况
  46. return true
  47. }
  48. if (ch == '=' && text != "" && text[text.length-1] == '.') {
  49. return true
  50. } // 在前一个小数点合法的情况下,准许运算
  51. if (text == "" || text[text.length-1] in sign) { // 给出不可以插入的普通情况
  52. return false
  53. }
  54. return true
  55. }
  56. // 提取展示的内容
  57. fun showGs(text: String): String {
  58. if (text.length <= len_1) {
  59. return text
  60. }
  61. return text.substring(text.length-len_1 until text.length)
  62. }
  63. // 判断符号优先性
  64. fun gle(fu1: Char, fu2: Char): Boolean {
  65. if ((fu2 == '+' || fu2 == '-') && fu1 != '(') return true
  66. if ((fu2 == '*' || fu2 == '/' || fu2 == '%') && fu1 != '(' && fu1 != '+' && fu1 != '-') return true
  67. return false
  68. }
  69. // 简单运算
  70. fun execute(a: Double, b: Double, fu: Char): Double {
  71. return when (fu) {
  72. '*' -> a * b
  73. '/' -> a / b
  74. '%' -> a % b
  75. '+' -> a + b
  76. else -> a - b
  77. }
  78. }
  79. // 运算
  80. fun getAnswer(gs: String): Value {
  81. Log.d("计算标志", "开始计算")
  82. // 首先判断能否进行运算
  83. var cnt = 0
  84. for (i in gs) {
  85. if (i == '(') cnt += 1
  86. else if (i == ')') cnt -= 1
  87. }
  88. if ((gs[gs.length-1] in sign__ && gs[gs.length-1] != '.') || (gs[gs.length-1] == '.' && (gs.length == 1 || gs[gs.length-2] in sign)) || cnt != 0)
  89. return Value(false, 0.0)
  90. // 预处理这个字符串
  91. val num_sign = mutableListOf<valueSign>()
  92. var temp = ""
  93. var last = ' '
  94. for (i in gs) {
  95. if (!(i == '+' && (last == 'e' || last == 'E')) && i in sign_) { // 添加判断为了解决1e+5形式的科学计数法形式的结果参与运算
  96. if (temp != "")
  97. num_sign.add(valueSign(true, temp.toDouble(), '0'))
  98. temp = ""
  99. var t = '0'
  100. if (i == 'x') t = '*'
  101. else t = i
  102. // 判断是否为负数
  103. if (t == '-' && (num_sign.size == 0 || num_sign[num_sign.size-1].sign == '(')) temp += '-'
  104. else num_sign.add(valueSign(false, 0.0, t))
  105. }
  106. else temp += i
  107. last = i
  108. }
  109. if (temp != "") num_sign.add(valueSign(true, temp.toDouble(), '0'))
  110. // 定义两个栈,一个符号栈,一个数字栈
  111. val num = mutableListOf<Double>()
  112. val sign = mutableListOf<Char>()
  113. // 循环遍历这个字符串
  114. for (ch in num_sign) {
  115. // 根据ch不同的值做出不同的处理
  116. when {
  117. ch.flag -> {
  118. num.add(ch.value) // 再放回去
  119. }
  120. else -> {
  121. when (ch.sign) {
  122. '*' -> {
  123. while (sign.size != 0 && gle(sign[sign.size-1], ch.sign)) {
  124. val fu = sign.removeAt(sign.size-1)
  125. val b = num.removeAt(num.size-1)
  126. val a = num.removeAt(num.size-1)
  127. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  128. num.add(execute(a, b, fu))
  129. }
  130. sign.add('*')
  131. }
  132. '%' -> {
  133. while (sign.size != 0 && gle(sign[sign.size-1], ch.sign)) {
  134. val fu = sign.removeAt(sign.size-1)
  135. val b = num.removeAt(num.size-1)
  136. val a = num.removeAt(num.size-1)
  137. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  138. num.add(execute(a, b, fu))
  139. }
  140. sign.add('%')
  141. }
  142. '/' -> {
  143. while (sign.size != 0 && gle(sign[sign.size-1], ch.sign)) {
  144. val fu = sign.removeAt(sign.size-1)
  145. val b = num.removeAt(num.size-1)
  146. val a = num.removeAt(num.size-1)
  147. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  148. num.add(execute(a, b, fu))
  149. }
  150. sign.add('/')
  151. }
  152. '(' -> sign.add('(')
  153. ')' -> {
  154. var fu = sign.removeAt(sign.size - 1)
  155. while (fu != '(') {
  156. val b = num.removeAt(num.size-1)
  157. val a = num.removeAt(num.size-1)
  158. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  159. num.add(execute(a, b, fu))
  160. fu = sign.removeAt(sign.size - 1)
  161. }
  162. }
  163. '+' -> {
  164. while (sign.size != 0 && gle(sign[sign.size-1], ch.sign)) {
  165. val fu = sign.removeAt(sign.size-1)
  166. val b = num.removeAt(num.size-1)
  167. val a = num.removeAt(num.size-1)
  168. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  169. num.add(execute(a, b, fu))
  170. }
  171. sign.add('+')
  172. }
  173. '-' -> {
  174. while (sign.size != 0 && gle(sign[sign.size-1], ch.sign)) {
  175. val fu = sign.removeAt(sign.size-1)
  176. val b = num.removeAt(num.size-1)
  177. val a = num.removeAt(num.size-1)
  178. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  179. num.add(execute(a, b, fu))
  180. }
  181. sign.add('-')
  182. }
  183. }
  184. }
  185. }
  186. }
  187. // 取出全部的内容得到运算结果
  188. while (sign.size != 0) {
  189. val fu = sign.removeAt(sign.size - 1)
  190. val b = num.removeAt(num.size-1)
  191. val a = num.removeAt(num.size-1)
  192. if (b == 0.0 && (fu == '/' || fu == '%')) return Value(false, 0.0)
  193. num.add(execute(a, b, fu))
  194. }
  195. return Value(true, round(num[0] * 1e10) / 1e10)
  196. }
  197. // 没按下一个按键就返回一个值
  198. fun showAns(ans: TextView) {
  199. if (judgeInsertSign(gs, '=')) {
  200. val temp = getAnswer(gs)
  201. if (temp.flag) {
  202. if (temp.value > 999999999) ans.text = "%.6e".format(temp.value)
  203. else ans.text = temp.value.toString()
  204. }
  205. else {
  206. ans.text = "Error"
  207. }
  208. }
  209. else {
  210. ans.text = "Error"
  211. }
  212. }
  213. override fun onCreate(savedInstanceState: Bundle?) {
  214. super.onCreate(savedInstanceState)
  215. setContentView(R.layout.activity_main)
  216. val text = findViewById<TextView>(R.id.calc)
  217. val ans = findViewById<TextView>(R.id.ans)
  218. val b_ = findViewById<Button>(R.id.b_)
  219. b_.setOnClickListener {
  220. if (judgeInsertSign(gs, '(')) {
  221. gs = "${gs}("
  222. showAns(ans)
  223. }
  224. text.text = showGs(gs)
  225. // 添加音效
  226. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  227. mediaPlayer.start()
  228. }
  229. val _b = findViewById<Button>(R.id._b)
  230. _b.setOnClickListener {
  231. if (judgeInsertSign(gs, ')')) {
  232. gs = "${gs})"
  233. showAns(ans)
  234. }
  235. text.text = showGs(gs)
  236. // 添加音效
  237. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  238. mediaPlayer.start()
  239. }
  240. val b1 = findViewById<Button>(R.id.b1)
  241. b1.setOnClickListener {
  242. gs = ""
  243. text.text = showGs(gs)
  244. ans.text = ""
  245. // 添加音效
  246. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  247. mediaPlayer.start()
  248. }
  249. val b2 = findViewById<Button>(R.id.b2)
  250. b2.setOnClickListener {
  251. if (judgeInsertSign(gs, '/')) {
  252. gs = "${gs}/"
  253. showAns(ans)
  254. }
  255. text.text = showGs(gs)
  256. // 添加音效
  257. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  258. mediaPlayer.start()
  259. }
  260. val b3 = findViewById<Button>(R.id.b3)
  261. b3.setOnClickListener {
  262. if (judgeInsertSign(gs, 'x')) {
  263. gs = "${gs}x"
  264. showAns(ans)
  265. }
  266. text.text = showGs(gs)
  267. // 添加音效
  268. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  269. mediaPlayer.start()
  270. }
  271. val b4 = findViewById<Button>(R.id.b4)
  272. b4.setOnClickListener {
  273. if (gs != "") {
  274. gs = gs.substring(0 until gs.length - 1)
  275. showAns(ans)
  276. }
  277. text.text = showGs(gs)
  278. // 添加音效
  279. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  280. mediaPlayer.start()
  281. }
  282. val b5 = findViewById<Button>(R.id.b5)
  283. b5.setOnClickListener {
  284. gs = "${gs}7"
  285. text.text = showGs(gs)
  286. showAns(ans)
  287. // 添加音效
  288. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  289. mediaPlayer.start()
  290. }
  291. val b6 = findViewById<Button>(R.id.b6)
  292. b6.setOnClickListener {
  293. gs = "${gs}8"
  294. text.text = showGs(gs)
  295. showAns(ans)
  296. // 添加音效
  297. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  298. mediaPlayer.start()
  299. }
  300. val b7 = findViewById<Button>(R.id.b7)
  301. b7.setOnClickListener {
  302. gs = "${gs}9"
  303. text.text = showGs(gs)
  304. showAns(ans)
  305. // 添加音效
  306. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  307. mediaPlayer.start()
  308. }
  309. val b8 = findViewById<Button>(R.id.b8)
  310. b8.setOnClickListener {
  311. if (judgeInsertSign(gs, '-')) {
  312. gs = "${gs}-"
  313. showAns(ans)
  314. }
  315. text.text = showGs(gs)
  316. // 添加音效
  317. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  318. mediaPlayer.start()
  319. }
  320. val b9 = findViewById<Button>(R.id.b9)
  321. b9.setOnClickListener {
  322. gs = "${gs}4"
  323. text.text = showGs(gs)
  324. showAns(ans)
  325. // 添加音效
  326. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  327. mediaPlayer.start()
  328. }
  329. val b10 = findViewById<Button>(R.id.b10)
  330. b10.setOnClickListener {
  331. gs = "${gs}5"
  332. text.text = showGs(gs)
  333. showAns(ans)
  334. // 添加音效
  335. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  336. mediaPlayer.start()
  337. }
  338. val b11 = findViewById<Button>(R.id.b11)
  339. b11.setOnClickListener {
  340. gs = "${gs}6"
  341. text.text = showGs(gs)
  342. showAns(ans)
  343. // 添加音效
  344. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  345. mediaPlayer.start()
  346. }
  347. val b12 = findViewById<Button>(R.id.b12)
  348. b12.setOnClickListener {
  349. if (judgeInsertSign(gs, '+')) {
  350. gs = "${gs}+"
  351. showAns(ans)
  352. }
  353. text.text = showGs(gs)
  354. // 添加音效
  355. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  356. mediaPlayer.start()
  357. }
  358. val b13 = findViewById<Button>(R.id.b13)
  359. b13.setOnClickListener {
  360. gs = "${gs}1"
  361. text.text = showGs(gs)
  362. showAns(ans)
  363. // 添加音效
  364. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  365. mediaPlayer.start()
  366. }
  367. val b14 = findViewById<Button>(R.id.b14)
  368. b14.setOnClickListener {
  369. gs = "${gs}2"
  370. text.text = showGs(gs)
  371. showAns(ans)
  372. // 添加音效
  373. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  374. mediaPlayer.start()
  375. }
  376. val b15 = findViewById<Button>(R.id.b15)
  377. b15.setOnClickListener {
  378. gs = "${gs}3"
  379. text.text = showGs(gs)
  380. showAns(ans)
  381. // 添加音效
  382. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  383. mediaPlayer.start()
  384. }
  385. val b16 = findViewById<Button>(R.id.b16)
  386. b16.setOnClickListener {
  387. if (judgeInsertSign(gs, '=')) {
  388. val temp = getAnswer(gs)
  389. if (temp.flag) {
  390. if (temp.value > 999999999) text.text = showGs("%11.6e".format(temp.value))
  391. else text.text = showGs(temp.value.toString())
  392. gs = ""
  393. ans.text = ""
  394. }
  395. else {
  396. ans.text = "Error"
  397. }
  398. }
  399. else {
  400. ans.text = "Error"
  401. }
  402. // 添加音效
  403. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  404. mediaPlayer.start()
  405. }
  406. val b17 = findViewById<Button>(R.id.b17)
  407. b17.setOnClickListener {
  408. if (judgeInsertSign(gs, '%')) {
  409. gs = "${gs}%"
  410. showAns(ans)
  411. }
  412. text.text = showGs(gs)
  413. // 添加音效
  414. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  415. mediaPlayer.start()
  416. }
  417. val b18 = findViewById<Button>(R.id.b18)
  418. b18.setOnClickListener {
  419. gs = "${gs}0"
  420. text.text = showGs(gs)
  421. showAns(ans)
  422. // 添加音效
  423. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  424. mediaPlayer.start()
  425. }
  426. val b19 = findViewById<Button>(R.id.b19)
  427. b19.setOnClickListener {
  428. if (judgeInsertSign(gs, '.')) {
  429. gs = "${gs}."
  430. showAns(ans)
  431. }
  432. text.text = showGs(gs)
  433. // 添加音效
  434. val mediaPlayer = MediaPlayer.create(this, R.raw.click)
  435. mediaPlayer.start()
  436. }
  437. }
  438. }

activity_main.xml布局文件代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <TextView
  10. android:id="@+id/calc"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:layout_marginHorizontal="5dp"
  14. android:layout_marginTop="10dp"
  15. android:layout_marginBottom="10dp"
  16. android:background="@android:drawable/editbox_background"
  17. android:gravity="right"
  18. android:singleLine="true"
  19. android:text=""
  20. android:textSize="60sp" />
  21. <LinearLayout
  22. android:id="@+id/linear1"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/calc"
  26. android:layout_marginHorizontal="5dp">
  27. <Button
  28. android:id="@+id/b_"
  29. android:layout_width="wrap_content"
  30. android:layout_height="match_parent"
  31. android:text="("
  32. android:textSize="20sp"
  33. android:layout_weight="1"
  34. android:layout_marginEnd="9dp"/>
  35. <Button
  36. android:id="@+id/_b"
  37. android:layout_width="wrap_content"
  38. android:layout_height="match_parent"
  39. android:text=")"
  40. android:textSize="20sp"
  41. android:layout_weight="1"
  42. android:layout_marginEnd="9dp"/>
  43. <TextView
  44. android:id="@+id/ans"
  45. android:layout_width="185dp"
  46. android:layout_height="match_parent"
  47. android:background="@android:drawable/editbox_background"
  48. android:singleLine="true"
  49. android:paddingVertical="30dp"
  50. android:text=""
  51. android:textSize="20sp"
  52. android:layout_weight="2"
  53. android:gravity="right"/>
  54. </LinearLayout>
  55. <LinearLayout
  56. android:id="@+id/linear23"
  57. android:layout_width="match_parent"
  58. android:layout_height="wrap_content"
  59. android:orientation="vertical"
  60. android:layout_alignParentBottom="true"
  61. android:layout_below="@id/linear1">
  62. <LinearLayout
  63. android:id="@+id/linear2"
  64. android:layout_width="match_parent"
  65. android:layout_height="wrap_content"
  66. android:layout_weight="3"
  67. android:orientation="vertical">
  68. <LinearLayout
  69. android:layout_width="match_parent"
  70. android:layout_height="wrap_content"
  71. android:layout_weight="1"
  72. android:layout_marginHorizontal="5dp">
  73. <Button
  74. android:id="@+id/b1"
  75. android:layout_width="wrap_content"
  76. android:layout_height="match_parent"
  77. android:text="C"
  78. android:textSize="20sp"
  79. android:layout_weight="1"
  80. android:layout_marginEnd="9dp"/>
  81. <Button
  82. android:id="@+id/b2"
  83. android:layout_width="wrap_content"
  84. android:layout_height="match_parent"
  85. android:text="/"
  86. android:textSize="20sp"
  87. android:layout_weight="1"
  88. android:layout_marginEnd="9dp"/>
  89. <Button
  90. android:id="@+id/b3"
  91. android:layout_width="wrap_content"
  92. android:layout_height="match_parent"
  93. android:text="X"
  94. android:textSize="20sp"
  95. android:layout_weight="1"
  96. android:layout_marginEnd="9dp"/>
  97. <Button
  98. android:id="@+id/b4"
  99. android:layout_width="wrap_content"
  100. android:layout_height="match_parent"
  101. android:text="DEL"
  102. android:textSize="20sp"
  103. android:layout_weight="1"/>
  104. </LinearLayout>
  105. <LinearLayout
  106. android:layout_width="match_parent"
  107. android:layout_height="wrap_content"
  108. android:layout_weight="1"
  109. android:layout_marginHorizontal="5dp">
  110. <Button
  111. android:id="@+id/b5"
  112. android:layout_width="wrap_content"
  113. android:layout_height="match_parent"
  114. android:text="7"
  115. android:textSize="20sp"
  116. android:layout_weight="1"
  117. android:layout_marginEnd="9dp"/>
  118. <Button
  119. android:id="@+id/b6"
  120. android:layout_width="wrap_content"
  121. android:layout_height="match_parent"
  122. android:text="8"
  123. android:textSize="20sp"
  124. android:layout_weight="1"
  125. android:layout_marginEnd="9dp"/>
  126. <Button
  127. android:id="@+id/b7"
  128. android:layout_width="wrap_content"
  129. android:layout_height="match_parent"
  130. android:text="9"
  131. android:textSize="20sp"
  132. android:layout_weight="1"
  133. android:layout_marginEnd="9dp"/>
  134. <Button
  135. android:id="@+id/b8"
  136. android:layout_width="wrap_content"
  137. android:layout_height="match_parent"
  138. android:text="—"
  139. android:textSize="20sp"
  140. android:layout_weight="1"/>
  141. </LinearLayout>
  142. <LinearLayout
  143. android:layout_width="match_parent"
  144. android:layout_height="wrap_content"
  145. android:layout_weight="1"
  146. android:layout_marginHorizontal="5dp">
  147. <Button
  148. android:id="@+id/b9"
  149. android:layout_width="wrap_content"
  150. android:layout_height="match_parent"
  151. android:text="4"
  152. android:textSize="20sp"
  153. android:layout_weight="1"
  154. android:layout_marginEnd="9dp"/>
  155. <Button
  156. android:id="@+id/b10"
  157. android:layout_width="wrap_content"
  158. android:layout_height="match_parent"
  159. android:text="5"
  160. android:textSize="20sp"
  161. android:layout_weight="1"
  162. android:layout_marginEnd="9dp"/>
  163. <Button
  164. android:id="@+id/b11"
  165. android:layout_width="wrap_content"
  166. android:layout_height="match_parent"
  167. android:text="6"
  168. android:textSize="20sp"
  169. android:layout_weight="1"
  170. android:layout_marginEnd="9dp"/>
  171. <Button
  172. android:id="@+id/b12"
  173. android:layout_width="wrap_content"
  174. android:layout_height="match_parent"
  175. android:text="+"
  176. android:textSize="20sp"
  177. android:layout_weight="1"/>
  178. </LinearLayout>
  179. </LinearLayout>
  180. <LinearLayout
  181. android:id="@+id/linear3"
  182. android:layout_width="match_parent"
  183. android:layout_height="wrap_content"
  184. android:orientation="horizontal"
  185. android:layout_weight="2"
  186. android:layout_marginHorizontal="5dp">
  187. <LinearLayout
  188. android:layout_width="wrap_content"
  189. android:layout_height="match_parent"
  190. android:orientation="vertical"
  191. android:layout_weight="3">
  192. <LinearLayout
  193. android:layout_width="match_parent"
  194. android:layout_height="wrap_content"
  195. android:layout_weight="1">
  196. <Button
  197. android:id="@+id/b13"
  198. android:layout_width="wrap_content"
  199. android:layout_height="match_parent"
  200. android:text="1"
  201. android:textSize="20sp"
  202. android:layout_weight="1"
  203. android:layout_marginEnd="9dp"/>
  204. <Button
  205. android:id="@+id/b14"
  206. android:layout_width="wrap_content"
  207. android:layout_height="match_parent"
  208. android:text="2"
  209. android:textSize="20sp"
  210. android:layout_weight="1"
  211. android:layout_marginEnd="9dp"/>
  212. <Button
  213. android:id="@+id/b15"
  214. android:layout_width="wrap_content"
  215. android:layout_height="match_parent"
  216. android:text="3"
  217. android:textSize="20sp"
  218. android:layout_weight="1"
  219. android:layout_marginEnd="9dp"/>
  220. </LinearLayout>
  221. <LinearLayout
  222. android:layout_width="match_parent"
  223. android:layout_height="wrap_content"
  224. android:layout_weight="1">
  225. <Button
  226. android:id="@+id/b17"
  227. android:layout_width="wrap_content"
  228. android:layout_height="match_parent"
  229. android:text="%"
  230. android:textSize="20sp"
  231. android:layout_weight="1"
  232. android:layout_marginEnd="9dp"/>
  233. <Button
  234. android:id="@+id/b18"
  235. android:layout_width="wrap_content"
  236. android:layout_height="match_parent"
  237. android:text="0"
  238. android:textSize="20sp"
  239. android:layout_weight="1"
  240. android:layout_marginEnd="9dp"/>
  241. <Button
  242. android:id="@+id/b19"
  243. android:layout_width="wrap_content"
  244. android:layout_height="match_parent"
  245. android:text="."
  246. android:textSize="20sp"
  247. android:layout_weight="1"
  248. android:layout_marginEnd="9dp"/>
  249. </LinearLayout>
  250. </LinearLayout>
  251. <LinearLayout
  252. android:layout_width="wrap_content"
  253. android:layout_height="match_parent"
  254. android:layout_weight="1">
  255. <Button
  256. android:id="@+id/b16"
  257. android:layout_width="match_parent"
  258. android:layout_height="match_parent"
  259. android:text="="
  260. android:textSize="20sp"/>
  261. </LinearLayout>
  262. </LinearLayout>
  263. </LinearLayout>
  264. </RelativeLayout>

界面展示:

代码粗糙博君一笑。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/999920
推荐阅读
相关标签
  

闽ICP备14008679号