所谓的数据候选区就是这个:
数字候选区功能及实现:
说明:这部分其实也是textview.
本区功能:
一、实现数字显示到显示区。点击显示区选定某个格子后,再点击这里的数字,会在格子内显示相应的数字。在编辑题目的时候textview的text字体为黑色,解题的时候是红色,在解题的时候直接就是红色字体。如图:
逻辑:其实就是选择的textview的text等于候选数字区的textview的text.只不过在不同的状态下显示不同的颜色,没什么难的。
代码实现(这里面包括其他功能,看后面拆解。):
java
// 遍历设置每个数字(1,2,3,,,)的textview功能
for (TextView viewnum : anniushuzi) {
viewnum.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 当按下时的处理
//如果是空的才能修改
if (mytextview.getText().toString() == "") {
mytextview.setText(viewnum.getText());//修改选定的textvie的text等于点击的数字。
//stopSound();
mediaplayer.start();//播放声音
}
paichong(mytextview);//行列宫排重
out.println("标志为:"+biaozhi);
if (biaozhi==false){//biaozhi==false表示未出错,才保存,最后一步出错不保存。
save();
}
showsamenum(mytextview, viewnum);//找相同的数字并设置背景灰色,
//通过计数空值判断是否全部填写完成,空值为0完成,弹窗。
int i=0;
for (TextView textView : textViews) {
if (textView.getText().toString() == "") {
i++;
}
}
if(i==0&&biaozhi==false){
AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
builder1.setTitle("恭喜完成!");
builder1.setMessage("今年发大财!!!");
builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {//点击确定后操作
}
});
AlertDialog dialog = builder1.create();
dialog.show();
}
}
return false; // 返回true表示已消费事件,不再传递
}
});
}
其实实现显示数字就一条就够了:
mytextview.setText(viewnum.getText());
这里面的mytextview就是上篇我提到的一个public变量,表示的是当前点击的格子。但有多个条件限制这个功能实现。比如:只有当这个格子为空的情况下才可以填写,不然就会覆盖。下面判断代码实现:
if (mytextview.getText().toString() == "") {
mytextview.setText(viewnum.getText());//修改选定的textvie的text等于点击的数字。
//stopSound();
mediaplayer.start();//播放声音
}
这里面用到了tostring(),因为textview的text不是字符型数据,必须转化为字符才能和""进行比较。
(播放声音后面说明 。)
上面代码的anniushuzi是1-9这几个数字textview组成的数组:
java
anniushuzi = new TextView[]{textview1, textview2, textview3, textview4, textview5, textview6, textview7, textview8, textview9};
通过循环实现单个数字的点击功能也是挺巧妙的,之前我一个数字写一个,没把我累死,出错了,改也麻烦,整个代码臃肿无比,后来也不知道脑子咋想的代码就成一块了,很好。
二、排重。无论是在题目编辑还是在解题的时候,由于操作错误还是思考错误"行,列,宫"内都可以出现重复数字,这是违反规则的,所以必须要显示出来。这个功能实现是先排重再弹窗提示。
1、排重。(函数:paichong())这个功能的实现就是通过对每行,每列,每宫的数字进行轮循比较,实现只要行内、列内,宫内有两个数字相同就属于重复。
代码:
java
public void paichong(TextView view) {//view为点击的textview,即mytextview.通过点击赋值,每次点击都会变。
//行内重复判定,列宫的判定方法相同。
biaozhi=false;
for (int i = 0; i < 9; i++) {//遍历textviewhang数组
for (int j = 0; j < 9; j++) {//遍历textviewhang内每行数组内的元素,即每行的textview。
if (textViewshang[i][j] == view) {//定位点击的textview所在行,如果相等则textviewshang[i]即为mytextview所在行。
int k = 0;//计数初始化
for (TextView viewhang : textViewshang[i]) {//遍历行
if (viewhang.getText().toString().equals(view.getText().toString())) {//找到与输入的数值(1,2,3..。)相等的textview并计数。转下行。。
k++;//计数+1,与k+=1相同 //==比较的是地址,可能不相同,equals()比较的是值,此处只能用equals(),否则排重出错。
};
if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {//如果值(1,2,3..)相同并且计数等于2(重复)则背景改为红色
biaozhi=true;//如果填写重复数字(两个数字相同)的标志
//弹窗
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("二货!");
builder.setMessage("行内输入重复!!!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {//点击确定后操作
//view1.setBackgroundColor(Color.GRAY);
view.setBackgroundColor(Color.GRAY);//颜色改为灰
view.setText("");//清空输入的重复值
}
});
AlertDialog dialog = builder.create();
dialog.show();
break;
}
}
}
}
}
//列内重复判定
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (textViewslie[i][j] == view) {
int k = 0;
for (TextView viewlie : textViewslie[i]) {
if (viewlie.getText().toString().equals(view.getText().toString())) {
k++;
}
;
if (viewlie.getText().toString().equals(view.getText().toString()) && k == 2) {
view.setBackgroundColor(Color.RED);
biaozhi=true;
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("二货!");
builder.setMessage("列内输入重复!!!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//view1.setBackgroundColor(Color.GRAY);
view.setBackgroundColor(Color.GRAY);
view.setText("");
}
});
AlertDialog dialog = builder.create();
dialog.show();
break;
}
}
}
}
}
//宫内重复判定
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (textViewsgong[i][j] == view) {
int k = 0;
for (TextView viewgong : textViewsgong[i]) {
if (viewgong.getText().toString().equals(view.getText().toString())) {
k++;
}
;
if (viewgong.getText().toString().equals(view.getText().toString()) && k == 2) {
//view.setBackgroundColor(Color.RED);
biaozhi=true;
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("二货!");
builder.setMessage("宫内输入重复!!!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//view1.setBackgroundColor(Color.GRAY);
view.setBackgroundColor(Color.GRAY);
view.setText("");
}
});
AlertDialog dialog = builder.create();
dialog.show();
break;
}
}
}
}
}
}
(其实代码应该还可以简化,懒得改,看,之前显示区的81个格子就是这样的代码,好恐怖。)
textViewshang[i][j] 是个二维数组。textViewslie[i][j],textViewsgong[i][j]也一样,就是行列宫都使用二级数组,在这里很好用。
java
textViewshang = new TextView[][]{textViewshang1, textViewshang2, textViewshang3, textViewshang4, textViewshang5, textViewshang6, textViewshang7, textViewshang8, textViewshang9};
textViewslie = new TextView[][]{textViewslie1, textViewslie2, textViewslie3, textViewslie4, textViewslie5, textViewslie6, textViewslie7, textViewslie8, textViewslie9};
textViewsgong = new TextView[][]{textviewgonh1, textviewgonh2, textviewgonh3, textviewgonh4, textviewgonh5, textviewgonh6, textviewgonh7, textviewgonh8, textviewgonh9};
而里面的每个元素又是一个一维数组,看看有多恐怖:
java
//行
textViewshang1 = new TextView[]{textview11, textview12, textview13, textview14, textview15, textview16, textview17, textview18, textview19};
textViewshang2 = new TextView[]{textview21, textview22, textview23, textview24, textview25, textview26, textview27, textview28, textview29};
textViewshang3 = new TextView[]{textview31, textview32, textview33, textview34, textview35, textview36, textview37, textview38, textview39};
textViewshang4 = new TextView[]{textview41, textview42, textview43, textview44, textview45, textview46, textview47, textview48, textview49};
textViewshang5 = new TextView[]{textview51, textview52, textview53, textview54, textview55, textview56, textview57, textview58, textview59};
textViewshang6 = new TextView[]{textview61, textview62, textview63, textview64, textview65, textview66, textview67, textview68, textview69};
textViewshang7 = new TextView[]{textview71, textview72, textview73, textview74, textview75, textview76, textview77, textview78, textview79};
textViewshang8 = new TextView[]{textview81, textview82, textview83, textview84, textview85, textview86, textview87, textview88, textview89};
textViewshang9 = new TextView[]{textview91, textview92, textview93, textview94, textview95, textview96, textview97, textview98, textview99};
//列
textViewslie1 = new TextView[]{textview11, textview21, textview31, textview41, textview51, textview61, textview71, textview81, textview91};
textViewslie2 = new TextView[]{textview12, textview22, textview32, textview42, textview52, textview62, textview72, textview82, textview92};
textViewslie3 = new TextView[]{textview13, textview23, textview33, textview43, textview53, textview63, textview73, textview83, textview93};
textViewslie4 = new TextView[]{textview14, textview24, textview34, textview44, textview54, textview64, textview74, textview84, textview94};
textViewslie5 = new TextView[]{textview15, textview25, textview35, textview45, textview55, textview65, textview75, textview85, textview95};
textViewslie6 = new TextView[]{textview16, textview26, textview36, textview46, textview56, textview66, textview76, textview86, textview96};
textViewslie7 = new TextView[]{textview17, textview27, textview37, textview47, textview57, textview67, textview77, textview87, textview97};
textViewslie8 = new TextView[]{textview18, textview28, textview38, textview48, textview58, textview68, textview78, textview88, textview98};
textViewslie9 = new TextView[]{textview19, textview29, textview39, textview49, textview59, textview69, textview79, textview89, textview99};
//宫
textviewgonh1 = new TextView[]{textview11, textview12, textview13, textview21, textview22, textview23, textview31, textview32, textview33};
textviewgonh2 = new TextView[]{textview14, textview15, textview16, textview24, textview25, textview26, textview34, textview35, textview36};
textviewgonh3 = new TextView[]{textview17, textview18, textview19, textview27, textview28, textview29, textview37, textview38, textview39};
textviewgonh4 = new TextView[]{textview41, textview42, textview43, textview51, textview52, textview53, textview61, textview62, textview63};
textviewgonh5 = new TextView[]{textview44, textview45, textview46, textview54, textview55, textview56, textview64, textview65, textview66};
textviewgonh6 = new TextView[]{textview47, textview48, textview49, textview57, textview58, textview59, textview67, textview68, textview69};
textviewgonh7 = new TextView[]{textview71, textview72, textview73, textview81, textview82, textview83, textview91, textview92, textview93};
textviewgonh8 = new TextView[]{textview74, textview75, textview76, textview84, textview85, textview86, textview94, textview95, textview96};
textviewgonh9 = new TextView[]{textview77, textview78, textview79, textview87, textview88, textview89, textview97, textview98, textview99};
个人觉得这里的思路也挺牛逼的,我------挺牛逼:)。其实逻辑简单,实现比较麻烦。view为点击的textview,即mytextview.通过点击赋值,每次点击都会变。然后轮循81个格子,发现一样的就弹窗警告重复。但这里实际不是只重复了81次,是三个81次,因为行,列,宫各81次,也就是说每填写一个数字都进行三个81次的轮循。当然有重复的不会循环这么多次,但没有重复一定都会轮循完成。
biaozhi=false;
这是一个标志,给别的地方用的,就是有重复的情况下为true,否则为false.暂时不讲。
计数和弹窗:
java
if (viewhang.getText().toString().equals(view.getText().toString())) {//找到与输入的数值(1,2,3..。)相等的textview并计数。转下行。。
k++;//计数+1,与k+=1相同 //==比较的是地址,可能不相同,equals()比较的是值,此处只能用equals(),否则排重出错。
};
if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {//如果值(1,2,3..)相同并且计数等于2(重复)则背景改为红色
biaozhi=true;//如果填写重复数字(两个数字相同)的标志
//弹窗
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("二货!");
builder.setMessage("行内输入重复!!!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {//点击确定后操作
//view1.setBackgroundColor(Color.GRAY);
view.setBackgroundColor(Color.GRAY);//颜色改为灰
view.setText("");//清空输入的重复值
}
});
AlertDialog dialog = builder.create();
dialog.show();
break;
if (viewhang.getText().toString().equals(view.getText().toString())) {(
k++;
};
上面代码,有相同计数加1。后面:
if (viewhang.getText().toString().equals(view.getText().toString()) && k == 2) {}
如果"行内"某个格子与点击的格子的text相同,并且值为2,则为重复。(个人感觉不用这么麻烦,但现在懒得想,懒得改,反正正常能跑。
弹窗不说了,正常的警告窗口,上个图吧。
三、显示复制数字。这个跟显示区功能相同,填写完成后也需要显示所有相同数字。
四、保存当前题目完成度。其实每填写一个数字都会保存,防止玩半截退出再打开的时候进度不一样。save()函数。
代码:
java
public void save() {
File file = new File(getFilesDir(), "1000.txt");
try (PrintWriter out = new PrintWriter(new FileWriter(file))) {
for (TextView textView : textViews) {
String strings = textView.getText().toString();
out.print(strings);
out.print(",");
}
} catch (IOException e) {
e.printStackTrace();
}
}
(关于文件保存读取看之前的博客)
文件路径:/data/data/包名/files/1000.txt
这里面要讲的是保存的文件格式。以","为分隔的字符串。看图:
这就是81个格子的信息,读写都按这个格式。
保存到文件的地方app还插多,反正方式都一样,调用函数就行了。
五、完成所有数字填写后弹窗。
代码:
java
if(i==0&&biaozhi==false){
AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
builder1.setTitle("恭喜完成!");
builder1.setMessage("今年发大财!!!");
builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {//点击确定后操作
}
});
AlertDialog dialog = builder1.create();
dialog.show();
}
这里面用到了两个判定标准,1、所有格子都填完了;2、没有出错。如果出错不保存,如果出错了也保存了,还退出了,再打开 的时候显示的就是错的。只有两个条件都成立才保存。
这部分也就这样了,app的关键功能都完成了,下一篇是其他几个功能按键,可能的话一起说完。