zoukankan      html  css  js  c++  java
  • android端app(口算测试)

    最近综合了一下android学的知识也根据up主的视频开发了一款适合儿童的口算app,下面我来大致介绍一下这款app的功能和开发思路:

    首先看一下我的na'vgation(页面导航):开始是欢迎页面,之后点击enter会进入答题页面,之后答对会得一分,每次直到答题错误会再之后的页面生成你的成绩,如果你的成绩大于历史得分对高分,就会跳转到Win页面,否则跳转到Lose页面。

     首页面:

     答题页面:

     Lose界面:

     win界面:

     下面我给一些源码供大家看一下:

    java代码:

    loseFragment:

    package com.example.canceltext;
    
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import androidx.databinding.DataBindingUtil;
    import androidx.fragment.app.Fragment;
    import androidx.lifecycle.SavedStateViewModelFactory;
    import androidx.lifecycle.ViewModelProviders;
    import androidx.navigation.Navigation;
    
    import com.example.canceltext.databinding.FragmentDefeatBinding;
    
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class loseFragment extends Fragment {
    
        public loseFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            MyViewModel myViewModel;
            myViewModel = ViewModelProviders.of(requireActivity(), new SavedStateViewModelFactory(requireActivity().getApplication(), requireActivity())).get(MyViewModel.class);
    
            final FragmentDefeatBinding binding ;
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_defeat,container,false);
            binding.setData(myViewModel);
            binding.setLifecycleOwner(getActivity());
            binding.button14.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Navigation.findNavController(v).navigate(R.id.action_loseFragment_to_tatelFragment);
                }
            });
            // Inflate the layout for this fragment
            return binding.getRoot();
        }
    }

    MainActivity:

    package com.example.canceltext;
    
    import android.content.DialogInterface;
    import android.os.Bundle;
    
    
    import androidx.appcompat.app.AlertDialog;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    import androidx.navigation.ui.NavigationUI;
    
    public class MainActivity extends AppCompatActivity {
        NavController controller;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            controller = Navigation.findNavController(this,R.id.fragment);
            NavigationUI.setupActionBarWithNavController(this,controller);
        }
    
        @Override
        public boolean onSupportNavigateUp() {
            if(controller.getCurrentDestination().getId() == R.id.questionFragment){
                AlertDialog.Builder builder =new AlertDialog.Builder(this);
                builder.setTitle(R.string.quit_dialog_title);
                builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        controller.navigateUp();
                    }
                });
                builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
    
                    }
                });
            }
            return super.onSupportNavigateUp();
        }
    
        @Override
        public void onBackPressed() {
            onSupportNavigateUp();
        }
    }

    MyViewModel:

    package com.example.canceltext;
    
    import android.app.Application;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    
    
    import androidx.annotation.NonNull;
    import androidx.lifecycle.AndroidViewModel;
    import androidx.lifecycle.MutableLiveData;
    import androidx.lifecycle.SavedStateHandle;
    
    
    import java.util.Random;
    
    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 KEY_CURRENT_SCORE = "key_current_score";
        private static String KEY_LOSE_SCORE = "key_lose_score";
        public static 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_ANSWER,0);
                handle.set(KEY_OPERATOR,"+");
                handle.set(KEY_CURRENT_SCORE,0);
            }
            this.handle= handle;
        }
    
        public MutableLiveData<Integer> getLiftnumber(){
            return handle.getLiveData(KEY_LEFT_NUMBER);
        }
        public MutableLiveData<Integer> getRightnumber(){
            return handle.getLiveData(KEY_RIGHT_NUMBER);
        }
        public MutableLiveData<Integer> getHighScore(){
            return handle.getLiveData(KEY_HIGH_SCORE);
        }
        public MutableLiveData<Integer> getCurrentScore(){
            return handle.getLiveData(KEY_CURRENT_SCORE);
        }
        public MutableLiveData<Integer> getLoseScore(){
            return handle.getLiveData(KEY_LOSE_SCORE);
        }
        public MutableLiveData<String> getOperator(){
            return handle.getLiveData(KEY_OPERATOR);
        }
        public MutableLiveData<Integer> getAnswer(){
            return handle.getLiveData(KEY_ANSWER);
        }
         void generator(){
            int LEVEL = 20;
             Random random = new Random();
             int x =random.nextInt(LEVEL)+1;
             int y =random.nextInt(LEVEL)+1;
             if(x%2==0){
                 getOperator().setValue("+");
                 if(x>y){
                     getAnswer().setValue(x);
                     getLiftnumber().setValue(y);
                     getRightnumber().setValue(x-y);
                 }else{
                     getAnswer().setValue(y);
                     getLiftnumber().setValue(x);
                     getRightnumber().setValue(y-x);
                 }
             }else{
                 getOperator().setValue("-");
                 if(x>y){
                     getAnswer().setValue(x-y);
                     getLiftnumber().setValue(x);
                     getRightnumber().setValue(y);
                 }else{
                     getAnswer().setValue(y-x);
                     getLiftnumber().setValue(y);
                     getRightnumber().setValue(x);
                 }
             }
    
         }
         void save(){
            SharedPreferences sharedPreferences = getApplication().getSharedPreferences(SAVE_SHP_DATA_NAME,Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putInt(KEY_HIGH_SCORE,getHighScore().getValue());
            editor.apply();
         }
         @SuppressWarnings("ConstantConditions")
         void answerCurrent(){
           getCurrentScore().setValue(getCurrentScore().getValue() + 1);
           if(getCurrentScore().getValue()>getHighScore().getValue()){
               getHighScore().setValue(getCurrentScore().getValue());
                WIN_FLAG =true;
           }
           generator();
         }
    }

    questionFragment:

    package com.example.canceltext;
    
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import androidx.annotation.NonNull;
    import androidx.databinding.DataBindingUtil;
    import androidx.fragment.app.Fragment;
    import androidx.lifecycle.SavedStateViewModelFactory;
    import androidx.lifecycle.ViewModelProviders;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    
    import com.example.canceltext.databinding.FragmentQuestionBinding;
    
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class questionFragment extends Fragment {
    
        public questionFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            final MyViewModel myViewModel;
            myViewModel = ViewModelProviders.of(requireActivity(), new SavedStateViewModelFactory(requireActivity().getApplication(), requireActivity())).get(MyViewModel.class);
    
            myViewModel.generator();
            final FragmentQuestionBinding binding;
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_question,container,false);
            binding.setLifecycleOwner(requireActivity());
            binding.setData(myViewModel);
            final StringBuilder builder = new StringBuilder();
            View.OnClickListener listener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()){
                        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.button10:
                            builder.setLength(0);
                            break;  case R.id.button11:
                            builder.append("0");
                            break;
                    }
                    if(builder.length()==0){
                    binding.textView9.setText(getString(R.string.input));
                    } else{
                     binding.textView9.setText(getString(R.string.input)+builder.toString());
                    }
                }
            };
            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.button10.setOnClickListener(listener);
            binding.button11.setOnClickListener(listener);
            binding.button12.setOnClickListener(new View.OnClickListener() {
                @SuppressWarnings("ConstantConditions")
                @Override
                public void onClick(View v) {
                    if(Integer.valueOf(builder.toString()).intValue()==myViewModel.getAnswer().getValue()){
                    myViewModel.answerCurrent();
                    builder.setLength(0);
                    binding.textView9.setText(R.string.answer_correct_message);
    
                    }else {
                        NavController controller = Navigation.findNavController(v);
                        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);
                        }
                         myViewModel.getLoseScore().setValue(myViewModel.getCurrentScore().getValue());
                        myViewModel.getCurrentScore().setValue(0);
                    }
                }
            });
              return binding.getRoot();
            // Inflate the layout for this fragment
           // return inflater.inflate(R.layout.fragment_question, container, false);
        }
    }

    tatelFragment:

    package com.example.canceltext;
    
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import androidx.annotation.NonNull;
    import androidx.databinding.DataBindingUtil;
    import androidx.fragment.app.Fragment;
    import androidx.lifecycle.SavedStateViewModelFactory;
    import androidx.lifecycle.ViewModelProviders;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    
    import com.example.canceltext.databinding.FragmentQuestionBinding;
    
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class questionFragment extends Fragment {
    
        public questionFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            final MyViewModel myViewModel;
            myViewModel = ViewModelProviders.of(requireActivity(), new SavedStateViewModelFactory(requireActivity().getApplication(), requireActivity())).get(MyViewModel.class);
    
            myViewModel.generator();
            final FragmentQuestionBinding binding;
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_question,container,false);
            binding.setLifecycleOwner(requireActivity());
            binding.setData(myViewModel);
            final StringBuilder builder = new StringBuilder();
            View.OnClickListener listener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()){
                        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.button10:
                            builder.setLength(0);
                            break;  case R.id.button11:
                            builder.append("0");
                            break;
                    }
                    if(builder.length()==0){
                    binding.textView9.setText(getString(R.string.input));
                    } else{
                     binding.textView9.setText(getString(R.string.input)+builder.toString());
                    }
                }
            };
            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.button10.setOnClickListener(listener);
            binding.button11.setOnClickListener(listener);
            binding.button12.setOnClickListener(new View.OnClickListener() {
                @SuppressWarnings("ConstantConditions")
                @Override
                public void onClick(View v) {
                    if(Integer.valueOf(builder.toString()).intValue()==myViewModel.getAnswer().getValue()){
                    myViewModel.answerCurrent();
                    builder.setLength(0);
                    binding.textView9.setText(R.string.answer_correct_message);
    
                    }else {
                        NavController controller = Navigation.findNavController(v);
                        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);
                        }
                         myViewModel.getLoseScore().setValue(myViewModel.getCurrentScore().getValue());
                        myViewModel.getCurrentScore().setValue(0);
                    }
                }
            });
              return binding.getRoot();
            // Inflate the layout for this fragment
           // return inflater.inflate(R.layout.fragment_question, container, false);
        }
    }

    winFragment:

    package com.example.canceltext;
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import androidx.databinding.DataBindingUtil;
    import androidx.fragment.app.Fragment;
    import androidx.lifecycle.SavedStateViewModelFactory;
    import androidx.lifecycle.ViewModelProviders;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    
    import com.example.canceltext.databinding.FragmentWinBinding;
    
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class winFragment extends Fragment {
    
        public winFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                                 Bundle savedInstanceState) {
            MyViewModel myViewModel;
            myViewModel = ViewModelProviders.of(requireActivity(), new SavedStateViewModelFactory(requireActivity().getApplication(), requireActivity())).get(MyViewModel.class);
    
            FragmentWinBinding binding;
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_win,container,false);
            binding.setLifecycleOwner(requireActivity());
            binding.setData(myViewModel);
            binding.button13.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    NavController controller = Navigation.findNavController(v);
                    controller.navigate(R.id.action_winFragment_to_tatelFragment);
                }
            });
            //nflate the layout for this fragment
            //        return binding.getRoot();
            //    }
            //} I
  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/yangxionghao/p/12595232.html
Copyright © 2011-2022 走看看