在我的练习中,有一个3x3的按钮网格,有些带有数字,而有些没有,我应该将那些没有数字的按钮放在0到9之间,但是由用户放置,然后更改按钮的文本。我能怎么做?我尝试了一些方法,但是即使在互联网上搜索也无法正常工作,但并没有达到我想要的结果。
这是代码
public class MainActivity extends AppCompatActivity {
private Button btn;
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button_X00);
edit = (EditText) findViewById(R.id.edit_dialog);
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showDialog(edit.getText().toString());
return true;
}
});
}
private void showDialog(String str) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("input text");
View view = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
final EditText edit_dialog = (EditText) view.findViewById(R.id.edit_dialog);
edit_dialog.setText(str);
builder.setView(view);
builder.setNegativeButton("cancel",null);
builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
btn.setText(edit_dialog.getText().toString());
}
});
builder.show();
}
}
这是XML代码
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text_view_p8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="GRIGLIAMOD10"
android:textSize="30sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="418dp"
android:layout_height="586dp"
android:layout_marginTop="49dp"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/linearLayout2">
<androidx.gridlayout.widget.GridLayout
android:id="@+id/tabellaX"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="60dp">
<EditText
android:id="@+id/edit_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button_X22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="2" />
<Button
android:id="@+id/button_X00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="0"
android:focusable="false"/>
<Button
android:id="@+id/button_X01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text="" />
<Button
android:id="@+id/button_X12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="1" />
<Button
android:id="@+id/button_X02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="0" />
<Button
android:id="@+id/button_X20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="2" />
<Button
android:id="@+id/button_X21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text="" />
<Button
android:id="@+id/button_X10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="1" />
<Button
android:id="@+id/button_X11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="1"
app:layout_row="1" />
</androidx.gridlayout.widget.GridLayout>
</LinearLayout>
所以这是一种可能的解决方案。首先,在XML中,您可以避免同时使用线性布局,因为您使用的是约束布局。因此,XML如下所示。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view_p8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="GRIGLIAMOD10"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.gridlayout.widget.GridLayout
android:id="@+id/tabellaX"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="60dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_view_p8">
<Button
android:id="@+id/button_X00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="0" />
<Button
android:id="@+id/button_X01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
/>
<Button
android:id="@+id/button_X12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="1" />
<Button
android:id="@+id/button_X02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="0" />
<Button
android:id="@+id/button_X20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="2" />
<Button
android:id="@+id/button_X21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
/>
<Button
android:id="@+id/button_X22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="2" />
<Button
android:id="@+id/button_X10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="1" />
<Button
android:id="@+id/button_X11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="1"
app:layout_row="1" />
</androidx.gridlayout.widget.GridLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
我还更改了Java文件,并留下了一些评论,以防您想要与应用程序不同的行为。
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.util.ArrayList;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.gridlayout.widget.GridLayout;
public class MainActivity extends AppCompatActivity implements View.OnLongClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get all the buttons from the grid - be careful if you add another type of Touchable
ArrayList<View> gridButtons = ((GridLayout) findViewById(R.id.tabellaX)).getTouchables();
for (View v : gridButtons) {
((Button) v).setOnLongClickListener(this);
}
}
@Override
public boolean onLongClick(View v) {
// show the dialog ONLY if the button isn't set
if (((Button) v).getText().toString().isEmpty())
showDialog(v);
return true;
}
private void showDialog(final View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Input a number");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// get only the first inserted number(i.e. input: 45; take only the 4)
((Button) v).setText(input.getText().toString().substring(0, 1));
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
}
编辑
在答案下面的评论部分,您问我是否可以编辑该应用程序的行为。
如果单击第一个有数字的按钮,例如“ 4”,则必须将其添加到所有其他具有数字的按钮中;如果第二个按钮具有数字3,则该数字将变为7。但是如果例如,将5到6相加,则它不能成为11,而1必须是模块10。
package hr.hello.dm.test;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.util.ArrayList;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.gridlayout.widget.GridLayout;
public class MainActivity extends AppCompatActivity implements View.OnLongClickListener, View.OnClickListener {
private ArrayList<View> gridButtons;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get all the buttons from the grid - be careful if you add another type of Touchable
gridButtons = ((GridLayout) findViewById(R.id.tabellaX)).getTouchables();
for (View v : gridButtons) {
((Button) v).setOnLongClickListener(this);
((Button) v).setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
int value = Integer.parseInt(((Button) v).getText().toString());
for (View btn : gridButtons) {
if(v.getId() != btn.getId() && !((Button) btn).getText().toString().isEmpty()) {
int btnValue = Integer.parseInt(((Button) btn).getText().toString());
((Button) btn).setText(String.valueOf((value + btnValue)%10));
}
}
}
@Override
public boolean onLongClick(View v) {
if (((Button) v).getText().toString().isEmpty())
showDialog(v);
return true;
}
private void showDialog(final View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Input a number");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_NUMBER);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int value = Integer.parseInt(input.getText().toString());
((Button) v).setText(String.valueOf(value));
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
}
据我所知,您正在尝试做什么,下面的代码可能会对您有所帮助。
public class MainActivity extends AppCompatActivity{
Button[] buttons;
private final String TAG = this.getClass().getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttons = new Button[9];
buttons[0] = (Button) findViewById(R.id.button_X00);
buttons[1] = (Button) findViewById(R.id.button_X10);
buttons[2] = (Button) findViewById(R.id.button_X20);
buttons[3] = (Button) findViewById(R.id.button_X01);
buttons[4] = (Button) findViewById(R.id.button_X11);
buttons[5] = (Button) findViewById(R.id.button_X21);
buttons[6] = (Button) findViewById(R.id.button_X02);
buttons[7] = (Button) findViewById(R.id.button_X12);
buttons[8] = (Button) findViewById(R.id.button_X22);
for (int a = 0; a<buttons.length;a++){
showDialog(buttons[a]);
}
}
private void showDialog(final Button btn) {
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("input text");
View view = View.inflate(MainActivity.this,R.layout.dialog_activity, null);
builder.setView(view);
final EditText edit_dialog = view.findViewById(R.id.edit_dialog);
builder.setNegativeButton("cancel",null);
builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
btn.setText(edit_dialog.getText().toString());
}catch (Exception e){
Log.e(TAG, e.getMessage() + " " );
}
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
return true;
}
});
}
}
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.gridlayout.widget.GridLayout
android:id="@+id/tabellaX"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="60dp">
<Button
android:id="@+id/button_X22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="2"
app:layout_row="2" />
<Button
android:id="@+id/button_X00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="0"
app:layout_row="0"
android:focusable="false"/>
<Button
android:id="@+id/button_X01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true" />
<Button
android:id="@+id/button_X12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="2"
app:layout_row="1" />
<Button
android:id="@+id/button_X02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="2"
app:layout_row="0" />
<Button
android:id="@+id/button_X20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="0"
app:layout_row="2" />
<Button
android:id="@+id/button_X21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="1"
app:layout_row="2"/>
<Button
android:id="@+id/button_X10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="0"
app:layout_row="1" />
<Button
android:id="@+id/button_X11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
app:layout_column="1"
app:layout_row="1" />
</androidx.gridlayout.widget.GridLayout>
</LinearLayout>
这里是dialog_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view_p8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="GRIGLIAMOD10"
android:textSize="30sp" />
<EditText
android:id="@+id/edit_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"/>
</LinearLayout>