当前位置:网站首页>Bishi blog (13) -- oral arithmetic test app
Bishi blog (13) -- oral arithmetic test app
2022-07-04 08:32:00 【Zhou Keren】
1、 Create four Fragment:Title,Question,Win,Lose

2、 stay res Next create a navigation chart nav, Use a line to show the logical relationship between the four pages :

3、 to title Add an icon to the page , And in gradle Add dataBinding And dependence :
buildFeatures{
dataBinding = true;
}implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
4、 Get started Title page :

<string name="title_message">Calculation Test</string>
<string name="title_image_info">title image</string>
<string name="title_button_message">Enter</string>
<string name="high_score_message">High Score:%d</string>5、 do Question page :

<string name="button0">0</string>
<string name="button1">1</string>
<string name="button2">2</string>
<string name="button3">3</string>
<string name="button4">4</string>
<string name="button5">5</string>
<string name="button6">6</string>
<string name="button7">7</string>
<string name="button8">8</string>
<string name="button9">9</string>
<string name="button_clear">C</string>
<string name="button_submit">OK</string>
<string name="equal_symbol">=</string>
<string name="question_mark">\?</string>
<string name="current_score">Score:%d</string>
<string name="input_indicator">Your Answer:</string>6、 do win and lose page :


<string name="lose_image_message">lose image</string>
<string name="win_image_message">win image</string>
<string name="lose_message">You Lose!</string>
<string name="win_message">You Win!</string>
<string name="lose_score_message">Your Score:%d</string>
<string name="win_score_message">New Record:%d</string>
<string name="button_back_to_title">Back</string>7、 You need to create a ViewModel:
...
public class MyViewModel extends AndroidViewModel {
private SavedStateHandle handle;
private static String KEY_HIGH_SCORE = "key_high_score";
private static String KEY_LEFT_NUMBER = "key_left_number";
private static String KEY_RIGHT_NUMBER = "key_right_number";
private static String KEY_OPERATOR = "key_operator";
private static String KEY_ANSWER = "key_answer";
private static String SAVE_SHP_DATA_NAME = "save_shp_data_name";
private static String KEY_CURRENT_SCORE = "key_current_score";
boolean win_flag = false;
public MyViewModel(@NonNull Application application,SavedStateHandle handle){
super(application);
if (!handle.contains(KEY_HIGH_SCORE)){
SharedPreferences shp = getApplication().getSharedPreferences(SAVE_SHP_DATA_NAME, Context.MODE_PRIVATE);
handle.set(KEY_HIGH_SCORE,shp.getInt(KEY_HIGH_SCORE,0));
handle.set(KEY_LEFT_NUMBER,0);
handle.set(KEY_RIGHT_NUMBER,0);
handle.set(KEY_OPERATOR,"+");
handle.set(KEY_ANSWER,0);
handle.set(KEY_CURRENT_SCORE,0);
}
this.handle = handle;
}
MutableLiveData<Integer>getLeftNumber(){
return handle.getLiveData(KEY_LEFT_NUMBER);
}
MutableLiveData<Integer>getRightNumber(){
return handle.getLiveData(KEY_RIGHT_NUMBER);
}
MutableLiveData<Integer>getOperator(){
return handle.getLiveData(KEY_OPERATOR);
}
MutableLiveData<Integer>getHighScore(){
return handle.getLiveData(KEY_HIGH_SCORE);
}
MutableLiveData<Integer>getCurrentScore(){
return handle.getLiveData(KEY_CURRENT_SCORE);
}
MutableLiveData<Integer>getAnswer(){
return handle.getLiveData(KEY_ANSWER);
}
void generator(){
int LEVEL = 20;
Random random = new Random();
int x,y;
x = random.nextInt(LEVEL) + 1;
y = random.nextInt(LEVEL) + 1;
if (x % 2 == 0){
getOperator().setValue(Integer.valueOf("+"));
if (x > y){
getAnswer().setValue(x);
getLeftNumber().setValue(y);
getRightNumber().setValue(x - y);
}
else {
getAnswer().setValue(y);
getLeftNumber().setValue(x);
getRightNumber().setValue(y - x);
}
}
else {
getOperator().setValue(Integer.valueOf("-"));
if (x > y){
getAnswer().setValue(x - y);
getLeftNumber().setValue(x);
getRightNumber().setValue(y);
}
else {
getAnswer().setValue(y - x);
getLeftNumber().setValue(y);
getRightNumber().setValue(x);
}
}
}
@SuppressWarnings("ConstantConditions")
void save(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVE_SHP_DATA_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt(KEY_HIGH_SCORE,getHighScore().getValue());
editor.apply();
}
@SuppressWarnings("ConstantConditions")
void answerCorrect(){
getCurrentScore().setValue(getCurrentScore().getValue() + 1);
if (getCurrentScore().getValue() > getHighScore().getValue()){
getHighScore().setValue(getCurrentScore().getValue());
win_flag = true;
}
generator();
}
}
8、 Data binding :
fragment_title:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="data"
type="com.example.calculationtest.MyViewModel" />
</data>
...
<TextView
...
android:text="@{@string/high_score_message(data.highScore)}"
...
</layout>fragment_question:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="data"
type="com.example.calculationtest.MyViewModel" />
</data>
...
<TextView
...
android:text="@{@string/current_score(data.currentScore)}"
... />
...
<TextView
...
android:text="@{String.valueOf(data.leftNumber)}"
.../>
<TextView
...
android:text="@{data.operator}"
... />
<TextView
...
android:text="@{String.valueOf(data.rightNumber)}"
... />
...
</layout>fragment_win:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="data"
type="com.example.calculationtest.MyViewModel" />
</data>
...
<TextView
...
android:text="@{@string/win_score_message(data.highScore)}"
... />
...
</layout>fragment_lose:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="data"
type="com.example.calculationtest.MyViewModel" />
</data>
...
<TextView
...
android:text="@{@string/lose_score_message(data.currentScore)}"
... />
...
</layout>9、 Write fragment Code inside :
TitleFragment:
...
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyViewModel myViewModel;
myViewModel = new ViewModelProvider(requireActivity(),new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class);
FragmentTitleBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_title,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(requireActivity());
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavController controller = Navigation.findNavController(view);
controller.navigate(R.id.action_titleFragment_to_questionFragment);
}
});
return binding.getRoot();
// Inflate the layout for this fragment
//return inflater.inflate(R.layout.fragment_title, container, false);
}
}QuestionFragment:
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final MyViewModel myViewModel;
myViewModel = new ViewModelProvider(requireActivity(),new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class);
myViewModel.generator();
final FragmentQuestionBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_question,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(requireActivity());
final StringBuilder builder = new StringBuilder();// Create a variable string
View.OnClickListener listener = new View.OnClickListener() {
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button0:
builder.append("0");break;
case R.id.button1:
builder.append("1");break;
case R.id.button2:
builder.append("2");break;
case R.id.button3:
builder.append("3");break;
case R.id.button4:
builder.append("4");break;
case R.id.button5:
builder.append("5");break;
case R.id.button6:
builder.append("6");break;
case R.id.button7:
builder.append("7");break;
case R.id.button8:
builder.append("8");break;
case R.id.button9:
builder.append("9");break;
case R.id.button_clear:
builder.setLength(0);break;
}
if (builder.length() == 0){
binding.textView9.setText(getString(R.string.input_indicator));
}else {
binding.textView9.setText(builder.toString());
}
}
};
binding.button0.setOnClickListener(listener);
binding.button1.setOnClickListener(listener);
binding.button2.setOnClickListener(listener);
binding.button3.setOnClickListener(listener);
binding.button4.setOnClickListener(listener);
binding.button5.setOnClickListener(listener);
binding.button6.setOnClickListener(listener);
binding.button7.setOnClickListener(listener);
binding.button8.setOnClickListener(listener);
binding.button9.setOnClickListener(listener);
binding.buttonClear.setOnClickListener(listener);
binding.buttonSubmit.setOnClickListener(new View.OnClickListener() {
@SuppressWarnings("ConstantConditions")
@Override
public void onClick(View view) {
if(builder.length() == 0){// Without input
Toast.makeText(getActivity(), getString(R.string.input_null_message), Toast.LENGTH_SHORT).show();
return;
}
else if (Integer.valueOf(builder.toString()).intValue() == myViewModel.getAnswer().getValue()){
myViewModel.answerCorrect();
builder.setLength(0);
binding.textView9.setText(R.string.answer_correct_message);
// builder.append(getString(R.string.answer_correct_message));
}
else {
NavController controller = Navigation.findNavController(view);
if (myViewModel.win_flag){
controller.navigate(R.id.action_questionFragment_to_winFragment);
myViewModel.win_flag = false;
myViewModel.save();
}else {
controller.navigate(R.id.action_questionFragment_to_loseFragment);
}
}
}
});
return binding.getRoot();
}
}WinFragment:
...
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyViewModel myViewModel = new ViewModelProvider(requireActivity(),new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class);
FragmentWinBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_win,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(requireActivity());
binding.button11.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavController controller = Navigation.findNavController(view);
controller.navigate(R.id.action_winFragment_to_titleFragment);
}
});
return binding.getRoot();
}
}LoseFragment:
...
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyViewModel myViewModel = new ViewModelProvider(requireActivity(),new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class);
FragmentLoseBinding binding;
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_lose,container,false);
binding.setData(myViewModel);
binding.setLifecycleOwner(requireActivity());
binding.button10.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavController controller = Navigation.findNavController(view);
controller.navigate(R.id.action_loseFragment_to_titleFragment);
}
});
return binding.getRoot();
}
}10、MainActivity:
package com.example.calculationtest;
import ...
public class MainActivity extends AppCompatActivity {
NavController controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//controller = findNavController(this,R.id.fragment);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
controller = navHostFragment.getNavController();
NavigationUI.setupActionBarWithNavController(this,controller);
}
@Override
public boolean onSupportNavigateUp() {
if (Objects.requireNonNull(controller.getCurrentDestination()).getId() == R.id.questionFragment){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.quit_dialog_title));
builder.setPositiveButton(R.string.dialog_positive_message, (dialogInterface, i) -> controller.navigateUp());
builder.setNegativeButton(R.string.dialog_negative_message, (dialogInterface, i) -> {
});
AlertDialog dialog = builder.create();
dialog.show();
}else {
controller.navigate(R.id.titleFragment);
}
return super.onNavigateUp();
}
@Override
public void onBackPressed() {
onSupportNavigateUp();
}
}11、MyViewModel:
package com.example.calculationtest;
import ...
public class MyViewModel extends AndroidViewModel {
SavedStateHandle handle;
private static String KEY_HIGH_SCORE ="key_high_score";
private static String KEY_LEFT_NUMBER="key_left_number";
private static String KEY_RIGHT_NUMBER="key_right_number";
private static String KEY_OPERATOR = "key_operator";
private static String KEY_ANSWER= "key_answer";
private static String SAVE_SHP_DATA_NAME = "save_shp_data_name";
private static String CURRENT_SCORE = "current_score";
boolean win_flag = false;
// private String current = getApplication().getResources().getString(R.string.KEY_CURRENT_SCORE);
public MyViewModel(@NonNull Application application, SavedStateHandle handle) {
super(application);
if(!handle.contains(KEY_HIGH_SCORE)){
SharedPreferences shp = getApplication().getSharedPreferences(SAVE_SHP_DATA_NAME, Context.MODE_PRIVATE);
handle.set(KEY_HIGH_SCORE,shp.getInt(KEY_HIGH_SCORE,0));
handle.set(KEY_LEFT_NUMBER,0);
handle.set(KEY_RIGHT_NUMBER,0);
handle.set(KEY_OPERATOR,"+");
handle.set(KEY_ANSWER,0);
handle.set(CURRENT_SCORE, 0);
/*
handle.set(application.getString(R.string.KEY_CURRENT_SCORE),0 );
*/
}
this.handle = handle;
}
public MutableLiveData<Integer>getLeftNumber(){
return handle.getLiveData(KEY_LEFT_NUMBER);
}
public MutableLiveData<Integer>getRightNumber(){
return handle.getLiveData(KEY_RIGHT_NUMBER);
}
public MutableLiveData<String>getOperator(){
return handle.getLiveData(KEY_OPERATOR);
}
public MutableLiveData<Integer>getHighScore(){
return handle.getLiveData(KEY_HIGH_SCORE);
}
public MutableLiveData<Integer>getCurrentScore(){
return handle.getLiveData(CURRENT_SCORE);
}
public MutableLiveData<Integer>getAnswer(){
return handle.getLiveData(KEY_ANSWER);
}
void generator(){
int LEVEL = 20;
Random random = new Random();
int x,y;
x = random.nextInt(LEVEL) + 1;
y = random.nextInt(LEVEL) + 1;
if(x%2 == 0 ){
getOperator().setValue("+");
if(x>y){
getAnswer().setValue(x);
getLeftNumber().setValue(y);
getRightNumber().setValue(x - y);
}else {
getAnswer().setValue(y);
getLeftNumber().setValue(x);
getRightNumber().setValue(y - x);
}
}
else{
getOperator().setValue("-");
if (x > y){
getAnswer().setValue(x - y);
getLeftNumber().setValue(x);
getRightNumber().setValue(y);
}else{
getAnswer().setValue(y - x);
getLeftNumber().setValue(y);
getRightNumber().setValue(x);
}
}
}
void save(){
SharedPreferences shp = getApplication().getSharedPreferences(SAVE_SHP_DATA_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt(KEY_HIGH_SCORE, getHighScore().getValue());
editor.apply();
}
void answerCorrect() {
getCurrentScore().setValue(getCurrentScore().getValue() + 1);
if (getCurrentScore().getValue() > getHighScore().getValue()) {
getHighScore().setValue(getCurrentScore().getValue());
win_flag = true;
}
generator();
}
}
12、 Some resources that need to be sinicized are sinicized :

The final run result :
Simple oral arithmetic test APP
边栏推荐
- Système de surveillance zabbix contenu de surveillance personnalisé
- zabbix 5.0监控客户端
- Leetcode 146. LRU 缓存
- The second session of the question swiping and punching activity -- solving the switching problem with recursion as the background (I)
- Sort by item from the list within the list - C #
- Ecole bio rushes to the scientific innovation board: the annual revenue is 330million. Honghui fund and Temasek are shareholders
- [go basics] 1 - go go
- Add log file to slim frame - PHP
- Moher College phpmailer remote command execution vulnerability tracing
- How to re enable local connection when the network of laptop is disabled
猜你喜欢

MySQL relearn 1-centos install mysql5.7

Conversion of yolov5 XML dataset to VOC dataset

User login function: simple but difficult

Question 49: how to quickly determine the impact of IO latency on MySQL performance

Fault analysis | MySQL: unique key constraint failure

墨者学院-PHPMailer远程命令执行漏洞溯源

Take you to master the formatter of visual studio code

FOC控制

What if I forget the router password

How to choose solid state hard disk and mechanical hard disk in computer
随机推荐
Basic operations of databases and tables ----- view data tables
@Role of pathvariable annotation
Ecole bio rushes to the scientific innovation board: the annual revenue is 330million. Honghui fund and Temasek are shareholders
What determines vacuum permittivity and vacuum permeability? Why do these two physical quantities exist?
How to reset IntelliSense in vs Code- How to reset intellisense in VS Code?
根据数字显示中文汉字
学习Nuxt.js
zabbix监控系统自定义监控内容
【性能测试】一文读懂Jmeter
std::is_ union,std::is_ class,std::integral_ constant
运动【跑步 01】一个程序员的半马挑战:跑前准备+跑中调整+跑后恢复(经验分享)
The second session of the question swiping and punching activity -- solving the switching problem with recursion as the background (I)
C # implements a queue in which everything can be sorted
A method for detecting outliers of data
猜数字游戏
SSRF vulnerability exploitation - attack redis
Conversion of yolov5 XML dataset to VOC dataset
Snipaste convenient screenshot software, which can be copied on the screen
User login function: simple but difficult
【Go基础】2 - Go基本语句