android studio 开发
附上前俩天写的口算测试的代码:
主界面:
package com.example.calculationtest; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.ui.NavigationUI; import android.content.DialogInterface; import android.os.Bundle; public class MainActivity extends AppCompatActivity { NavController controller; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NavHostFragment hostFragment=(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); controller=hostFragment.getNavController(); NavigationUI.setupActionBarWithNavController(this,controller); } @Override public boolean onSupportNavigateUp() { if (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, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { controller.navigateUp(); } }); builder.setNegativeButton(R.string.dialog_negative_message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); AlertDialog dialog = builder.create(); dialog.show(); } else { controller.navigate(R.id.titleFragment); } return super.onSupportNavigateUp(); } @Override public void onBackPressed() { if(controller.getCurrentDestination().getId() == R.id.titleFragment) { android.os.Process.killProcess(android.os.Process.myPid()); } else { onSupportNavigateUp(); } } }
欢迎界面:
package com.example.calculationtest; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.lifecycle.SavedStateViewModelFactory; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.calculationtest.databinding.FragmentTitleBinding; /** * A simple {@link Fragment} subclass. * Use the {@link TitleFragment#newInstance} factory method to * create an instance of this fragment. */ public class TitleFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public TitleFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment TitleFragment. */ // TODO: Rename and change types and number of parameters public static TitleFragment newInstance(String param1, String param2) { TitleFragment fragment = new TitleFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyViewModel viewModel; viewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class); FragmentTitleBinding banding; banding = DataBindingUtil.inflate(inflater,R.layout.fragment_title,container,false); banding.setData(viewModel); banding.setLifecycleOwner(requireActivity()); banding.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 banding.getRoot(); // Inflate the layout for this fragment //return inflater.inflate(R.layout.fragment_title, container, false); } }
题目界面:
package com.example.calculationtest; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.lifecycle.SavedStateHandle; import androidx.lifecycle.SavedStateViewModelFactory; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Switch; import android.widget.Toast; import com.example.calculationtest.databinding.FragmentQuestionBinding; /** * A simple {@link Fragment} subclass. * Use the {@link QuestionFragment#newInstance} factory method to * create an instance of this fragment. */ public class QuestionFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public QuestionFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment QuestionFragment. */ // TODO: Rename and change types and number of parameters public static QuestionFragment newInstance(String param1, String param2) { QuestionFragment fragment = new QuestionFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = new Bundle(); MyViewModel viewModel; viewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class); viewModel.generator(); FragmentQuestionBinding binding; binding = DataBindingUtil.inflate(inflater,R.layout.fragment_question,container,false); binding.setData(viewModel); binding.setLifecycleOwner(requireActivity()); viewModel.getCurrentScore().setValue(0); StringBuilder builder = new StringBuilder(); View.OnClickListener listener = new View.OnClickListener() { public void onClick(View v) { switch (v.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.buttonclera: builder.setLength(0); break; } if (builder.length() == 0) { binding.textView9.setText(getString(R.string.question_input_answer)); } 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.buttonclera.setOnClickListener(listener); binding.buttonfix.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(builder.length() != 0) { if(Integer.valueOf(builder.toString()).intValue() == viewModel.getAnswer().getValue()) { viewModel.answerCorrect(); builder.setLength(0); binding.textView9.setText(R.string.answer_correct_message); } else { NavController controller= Navigation.findNavController(view); if(viewModel.win_flag) { controller.navigate(R.id.action_questionFragment_to_winFragment); viewModel.win_flag = false; viewModel.save(); } else { String score = String.valueOf(viewModel.getCurrentScore().getValue()); bundle.putString("SCORE",score); controller.navigate(R.id.action_questionFragment_to_loseFragment,bundle); } } } else { Toast.makeText(getActivity(),"请输入答案",Toast.LENGTH_SHORT).show(); } } }); return binding.getRoot(); // Inflate the layout for this fragment //return inflater.inflate(R.layout.fragment_question, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } }
成功界面:
package com.example.calculationtest; import android.os.Bundle; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.lifecycle.SavedStateViewModelFactory; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.calculationtest.databinding.FragmentWinBinding; /** * A simple {@link Fragment} subclass. * Use the {@link WinFragment#newInstance} factory method to * create an instance of this fragment. */ public class WinFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public WinFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment WinFragment. */ // TODO: Rename and change types and number of parameters public static WinFragment newInstance(String param1, String param2) { WinFragment fragment = new WinFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyViewModel viewModel; viewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class); FragmentWinBinding binding; binding = DataBindingUtil.inflate(inflater,R.layout.fragment_win,container,false); binding.setData(viewModel); 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(); // Inflate the layout for this fragment //return inflater.inflate(R.layout.fragment_win, container, false); } }
失败界面:
package com.example.calculationtest; import android.os.Bundle; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.lifecycle.SavedStateViewModelFactory; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.Navigation; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.calculationtest.databinding.FragmentLoseBinding; /** * A simple {@link Fragment} subclass. * Use the {@link LoseFragment#newInstance} factory method to * create an instance of this fragment. */ public class LoseFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public LoseFragment() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment LoseFragment. */ // TODO: Rename and change types and number of parameters public static LoseFragment newInstance(String param1, String param2) { LoseFragment fragment = new LoseFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String score = getArguments().getString("SCORE"); MyViewModel viewModel; viewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(requireActivity().getApplication(),this)).get(MyViewModel.class); FragmentLoseBinding binding; binding = DataBindingUtil.inflate(inflater,R.layout.fragment_lose,container,false); binding.setData(viewModel); binding.setLifecycleOwner(requireActivity()); binding.textView11.setText("你的得分:"+score); 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(); // Inflate the layout for this fragment //return inflater.inflate(R.layout.fragment_lose, container, false); } }
数据代码:
package com.example.calculationtest; 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 { 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; } 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(KEY_CURRENT_SCORE); } public MutableLiveData<Integer>getAnswer() { return handle.getLiveData(KEY_ANSWER); } void generator() { int LEVEL = 100; 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); } } } @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.commit(); } @SuppressWarnings("ConstantConditions") void answerCorrect() { getCurrentScore().setValue(getCurrentScore().getValue() + 1); if(getCurrentScore().getValue()>getHighScore().getValue()) { getHighScore().setValue(getCurrentScore().getValue()); win_flag = true; } generator(); } }