如何解决Android Studio:设置并传输选定的微调器值到下一个活动
我正在编写一个小游戏应用程序,每个玩家都可以选择一个可绘制对象,然后为以下活动设置一个可绘制对象,即小游戏。
这是我目前的代码:
public class Nameeingabespieler2 extends AppCompatActivity {
public static final String EXTRA_NAME1 = "com.example.die_trinkspielapp.EXTRA_NAME1";
public static final String EXTRA_NAME2 = "com.example.die_trinkspielapp.EXTRA_NAME2";
public static final String Dinonametest1 = "com.example.die_trinkspielapp.DinoSpieler1";
private TextInputLayout namespieler1;
private TextInputLayout namespieler2;
private ArrayList<DinoWahl> mDinoWahl;
private DinoAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nameeingabespieler2);
namespieler1 = findViewById(R.id.Spieler_1_input);
namespieler2 = findViewById(R.id.Spieler_2_input);
final TextView testtest = (TextView) findViewById(R.id.textView3);
initList();
final Spinner dinospinner = findViewById(R.id.spinner);
Spinner dinospinner2 = findViewById(R.id.spinner2);
mAdapter = new DinoAdapter(this,mDinoWahl);
dinospinner.setAdapter(mAdapter);
dinospinner2.setAdapter(mAdapter);
dinospinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,View view,int i,long l) {
DinoWahl clickedItem = (DinoWahl) adapterView.getItemAtPosition(i);
String DinoName = clickedItem.getmDinoName();
Toast.makeText(Nameeingabespieler2.this,DinoName + " ausgewählt",Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
dinospinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,long l) {
DinoWahl clickedItem = (DinoWahl) adapterView.getItemAtPosition(i);
String DinoName2 = clickedItem.getmDinoName();
Toast.makeText(Nameeingabespieler2.this,DinoName2 + " ausgewählt",Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
private void initList(){
mDinoWahl = new ArrayList<>();
mDinoWahl.add(new DinoWahl("Brutus",R.drawable.alkdino));
mDinoWahl.add(new DinoWahl("Skitty",R.drawable.coolerdino));
mDinoWahl.add(new DinoWahl("Pharmi",R.drawable.drogendino));
mDinoWahl.add(new DinoWahl("Luise",R.drawable.frauendino));
mDinoWahl.add(new DinoWahl("Rex",R.drawable.koenigsdino));
mDinoWahl.add(new DinoWahl("Cookie",R.drawable.kochdino));
mDinoWahl.add(new DinoWahl("Divi",R.drawable.magierdino));
mDinoWahl.add(new DinoWahl("Fumu",R.drawable.shishadino));
mDinoWahl.add(new DinoWahl("Dr. Saurum",R.drawable.streberdino));
}
private boolean wertspieler1() {
String usernameInput = namespieler1.getEditText().getText().toString().trim();
if (usernameInput.isEmpty()) {
namespieler1.setError("Spieler bitte eintragen");
return false;
} else if (usernameInput.length() > 15) {
namespieler1.setError("Name zu lang");
return false;
} else {
namespieler1.setError(null);
return true;
}
}
private boolean wertspieler2() {
String usernameInput = namespieler2.getEditText().getText().toString().trim();
if (usernameInput.isEmpty()) {
namespieler2.setError("Spieler bitte eintragen");
return false;
} else if (usernameInput.length() > 15) {
namespieler2.setError("Name zu lang");
return false;
} else {
namespieler2.setError(null);
return true;
}
}
public void starteaktivity(View view) {
if (!wertspieler1() | !wertspieler2()) {
return;
}
EditText editText1 = (EditText) findViewById(R.id.spieler1id);
String name1 = editText1.getText().toString();
EditText editText2 = (EditText) findViewById(R.id.Spieler2id);
String name2 = editText2.getText().toString();
if(name1.equals(name2)) {
Toast.makeText(Nameeingabespieler2.this,"bitte unterschiedliche Namen eingeben",Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent(this,Trinkspiel2spieler.class);
intent.putExtra(EXTRA_NAME1,name1);
intent.putExtra(EXTRA_NAME2,name2);
startActivity(intent);
}
}
}
到目前为止,这是我的代码,最相关的部分是这个。
initList();
final Spinner dinospinner = findViewById(R.id.spinner);
Spinner dinospinner2 = findViewById(R.id.spinner2);
mAdapter = new DinoAdapter(this,mDinoWahl);
dinospinner.setAdapter(mAdapter);
dinospinner2.setAdapter(mAdapter);
dinospinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
dinospinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
我没有选择要转移的可绘制对象,我真的需要你的帮助。
编辑 这是现在我更新的代码 我有不同的课程
- Nameeingabespieler2(我希望选择微调器类型并将其传输到 Trinkspiel2spieler.java 的类)
- Trinkspiel2spieler(这是 Value 应该去的类,并为 Nameeeingabespieler2 中选择的每个玩家设置 drawable)
- DinoWahl(用于旋转器)
- DinoAdapter(微调器的适配器)
我的问题现在是,即使我按照您所说的输入(第 162 行)所有内容,我也不会传输值。 如果我添加(第 26 和 27 行)这些 Spinner 声明,它们将不会被使用,如果我删除(第 41 和 42 行),那么应用程序就会崩溃。 但即使现在有了这个版本,下一个 Activity (Trinkspiel2spieler) 也不会打开。 我现在真的不知道该怎么办。 我真的很抱歉打扰你,但如果你能帮助我,我真的很感激。
public class Nameeingabespieler2 extends AppCompatActivity {
public static final String EXTRA_NAME1 = "com.example.die_trinkspielapp.EXTRA_NAME1";
public static final String EXTRA_NAME2 = "com.example.die_trinkspielapp.EXTRA_NAME2";
public static final String EXTRA_DINO1 = "com.example.die_trinkspielapp.DinoSpieler1";
public static final String Dinonametest2 = "com.example.die_trinkspielapp.DinoSpieler2";
private TextInputLayout namespieler1;
private TextInputLayout namespieler2;
private Spinner dinospinner;
private Spinner dinospinner2;
private ArrayList<DinoWahl> mDinoWahl;
private DinoAdapter mAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nameeingabespieler2);
namespieler1 = findViewById(R.id.Spieler_1_input);
namespieler2 = findViewById(R.id.Spieler_2_input);
Spinner dinospinner = findViewById(R.id.spinner);
Spinner dinospinner2 = findViewById(R.id.spinner2);
initList();
mAdapter = new DinoAdapter(this,mDinoWahl);
dinospinner.setAdapter(mAdapter);
dinospinner2.setAdapter(mAdapter);
dinospinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,long l) {
DinoWahl clickedItem = (DinoWahl) adapterView.getItemAtPosition(i);
String DinoName = clickedItem.getmDinoName();
Toast.makeText(Nameeingabespieler2.this,Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
dinospinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView,long l) {
Context ctx = view.getContext();
DinoWahl clickedItem = (DinoWahl) adapterView.getItemAtPosition(i);
String DinoName2 = clickedItem.getmDinoName();
Toast.makeText(Nameeingabespieler2.this,Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setClass(ctx,Constants.class);
intent.putExtra(Dinonametest2,DinoName2);
}
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
private void initList(){
mDinoWahl = new ArrayList<>();
mDinoWahl.add(new DinoWahl("Brutus",R.drawable.streberdino));
}
private boolean wertspieler1() {
String usernameInput = namespieler1.getEditText().getText().toString().trim();
if (usernameInput.isEmpty()) {
namespieler1.setError("Spieler bitte eintragen");
return false;
} else if (usernameInput.length() > 15) {
namespieler1.setError("Name zu lang");
return false;
} else {
namespieler1.setError(null);
return true;
}
}
private boolean wertspieler2() {
String usernameInput = namespieler2.getEditText().getText().toString().trim();
if (usernameInput.isEmpty()) {
namespieler2.setError("Spieler bitte eintragen");
return false;
} else if (usernameInput.length() > 15) {
namespieler2.setError("Name zu lang");
return false;
} else {
namespieler2.setError(null);
return true;
}
}
public void starteaktivity(View view) {
if (!wertspieler1() | !wertspieler2()) {
return;
}
EditText editText1 = (EditText) findViewById(R.id.spieler1id);
String name1 = editText1.getText().toString();
EditText editText2 = (EditText) findViewById(R.id.Spieler2id);
String name2 = editText2.getText().toString();
if(name1.equals(name2)) {
Toast.makeText(Nameeingabespieler2.this,Toast.LENGTH_LONG).show();
}
else{
Intent intent = new Intent(this,name2);
intent.putExtra(EXTRA_DINO1,((DinoWahl) dinospinner.getSelectedItem()).getmDinoName());
startActivity(intent);
}
}
}
Trinkspiel2spieler(尚未完成)
public class Trinkspiel2spieler extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trinkspiel2spieler);
Button testnamentest = (Button) findViewById(R.id.namenbuttonid);
testnamentest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startetest();
}
});
}
public void startetest() {
//namen einlesen
Intent intent = getIntent();
String nametextstring1 = intent.getStringExtra(Constants.EXTRA_NAME1);
String nametextstring2 = intent.getStringExtra(Constants.EXTRA_NAME2);
String Dino_uerbertragung1 = intent.getStringExtra(Constants.Dinonametest1);
String Dino_uerbertragung2 = intent.getStringExtra(Constants.Dinonametest2);
String Namen[] = {nametextstring1,nametextstring2};
//TextViews deklarieren
TextView Textview1 = (TextView) findViewById(R.id.nameanzeige1);
TextView Textview2 = (TextView) findViewById(R.id.nameanzeige2);
ImageView Dinoimage = (ImageView) findViewById(R.id.imageView2);
//TextView Textview3 = (TextView) findViewById(R.id.nameanzeige3);
Random random = new Random();
int num = random.nextInt(Namen.length);
Textview1.setText(Namen[num]);
if (Namen[num] == nametextstring1){
if (Dino_uerbertragung1 == "Cookie")
Dinoimage.setImageResource(R.drawable.kochdino);
}
else {
Dinoimage.setImageResource(R.drawable.coolerdinomrk2klein);
}
Resources resources = getResources();
String[] Trinkspielfragen = resources.getStringArray(R.array.Trinkspiel);
Random random1 = new Random();
int num2 = random1.nextInt(Trinkspielfragen.length);
Textview2.setText(Trinkspielfragen[num2]);
}
}
迪诺瓦尔
public class DinoWahl {
private String mDinoName;
private int mDinoWahl;
public DinoWahl(String Dinoname,int dinoBild) {
mDinoName = Dinoname;
mDinoWahl = dinoBild;
}
public String getmDinoName() {
return mDinoName;
}
public int getDinoWahl(){
return mDinoWahl;
}
}
恐龙适配器
public class DinoAdapter extends ArrayAdapter <DinoWahl>{
public DinoAdapter(Context context,ArrayList<DinoWahl> DinoListe) {
super(context,DinoListe);
}
@NonNull
@Override
public View getView(int position,@Nullable View convertView,@NonNull ViewGroup parent) {
return initView(position,convertView,parent);
}
@Override
public View getDropDownView(int position,parent);
}
private View initView(int position,View convertView,ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.dino_spinner,parent,false
);
}
ImageView imageViewDino = convertView.findViewById(R.id.alkoholdino);
TextView textViewName = convertView.findViewById(R.id.Dinoname);
DinoWahl curentItem = getItem(position);
if (curentItem != null) {
imageViewDino.setImageResource(curentItem.getDinoWahl());
textViewName.setText(curentItem.getmDinoName());
}
return convertView;
}
}
常量
package com.example.die_trinkspielapp;
公共类常量{ public static final String EXTRA_NAME1 = "com.example.die_trinkspielapp.EXTRA_NAME1"; public static final String EXTRA_NAME2 = "com.example.die_trinkspielapp.EXTRA_NAME2"; public static final String EXTRA_NAME3 = "com.example.die_trinkspielapp.EXTRA_NAME3"; public static final String EXTRA_NAME4 = "com.example.die_trinkspielapp.EXTRA_NAME4"; public static final String EXTRA_NAME5 = "com.example.die_trinkspielapp.EXTRA_NAME5"; public static final String EXTRA_NAME6 = "com.example.die_trinkspielapp.EXTRA_NAME6"; public static final String EXTRA_NAME7 = "com.example.die_trinkspielapp.EXTRA_NAME7"; public static final String EXTRA_NAME8 = "com.example.die_trinkspielapp.EXTRA_NAME8"; public static final String EXTRA_NAME9 = "com.example.die_trinkspielapp.EXTRA_NAME9";
public static final String Dinonametest1 = "com.example.die_trinkspielapp.DinoSpieler1";
public static final String Dinonametest2 = "com.example.die_trinkspielapp.DinoSpieler2";
public static final String Dinonametest3 = "com.example.die_trinkspielapp.DinoSpieler3";
public static final String Dinonametest4 = "com.example.die_trinkspielapp.DinoSpieler4";
public static final String Dinonametest5 = "com.example.die_trinkspielapp.DinoSpieler5";
public static final String Dinonametest6 = "com.example.die_trinkspielapp.DinoSpieler6";
public static final String Dinonametest7 = "com.example.die_trinkspielapp.DinoSpieler7";
public static final String Dinonametest8 = "com.example.die_trinkspielapp.DinoSpieler8";
public static final String Dinonametest9 = "com.example.die_trinkspielapp.DinoSpieler9";
}
如果你能在这里帮助我,我会根据你的需要命名玩家可以选择的 Drawables(Dinos) 之一
解决方法
在您的“starteaktivity”方法中,您已经有了答案,您只需要将选定的值通过 extra 传递给意图。
编辑:为了更准确
嗨@MarcStumpp
我已经尝试过了,但该值不会进入 startactivity。如果我在 Spinner 函数中将它设置为字符串值,它就不会识别它。你知道我该如何解决这个问题吗?
我认为您的代码在这种情况下不完整。
- 首先,您应该将微调器声明为活动的属性变量
public class Nameeingabespieler2 extends AppCompatActivity {
private TextInputLayout namespieler1;
private TextInputLayout namespieler2;
private Spinner dinospinner;
private Spinner dinospinner2;
private ArrayList<DinoWahl> mDinoWahl;
private DinoAdapter mAdapter;
...
- 然后在您的“starteaktivity”方法中,您可以获得微调器的值,将其作为您的意图的额外传递:
if(name1.equals(name2)) {
Toast.makeText(Nameeingabespieler2.this,"bitte unterschiedliche Namen eingeben",Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent(this,Trinkspiel2spieler.class);
intent.putExtra(EXTRA_NAME1,name1);
intent.putExtra(EXTRA_NAME2,name2);
intent.putExtra(EXTRA_NAME3,((DinoWahl) dinospinner.getSelectedItem()).getmDinoName());
...
startActivity(intent);
}
- 检索“Trinkspiel2spieler”活动中的值:
public class Trinkspiel2spieler extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trinkspiel2spieler);
String firstSpinnerVal = getIntent().getStringExtra(Constants.EXTRA_NAME3);
...
}
}
建议
我建议您为您的额外创建一个 Constants 类,例如:
public class Constants {
public static final String EXTRA_NAME1 = "com.example.die_trinkspielapp.EXTRA_NAME1";
public static final String EXTRA_NAME2 = "com.example.die_trinkspielapp.EXTRA_NAME2";
public static final String EXTRA_NAME3 = "com.example.die_trinkspielapp.EXTRA_NAME3";
...
public static final String Dinonametest1 = "com.example.die_trinkspielapp.DinoSpieler1";
}
这样,您可以在整个活动中使用相同的额外键并降低输入错误的风险。
,我没有 SO 上的行号,最好是复制并粘贴您认为有问题的行。或者以截图为例。无论如何,我将代码复制到我的 IDE 中。
关于编辑部分:
我的问题现在是,即使我按照您所说的输入(第 162 行)所有内容,我也不会传输值。如果我添加(第 26 和 27 行)这些 Spinner 声明,它们将不会被使用,如果我删除(第 41 和 42 行),那么应用程序就会崩溃。
这很正常,让我们看看 android studio 代码检查员怎么说:
- 您不应该将静态密钥保留在这里,因为它们现在已经在您的 Constant 类中。如果您保留双重引用,则会增加出错的风险。
- 注意你的变量名的颜色,dinospinner 和 dinospinner2 是灰色的,为什么? IDE 可以为您提供答案(仅超过其中一个): Android Studio 告诉您从未分配过该值!要理解我们应该看看你提到的第 41 和 42 行: 由于 Spinner 位于行的开头,因此您将在此处将 Spinner 值分配给一个全新的变量。再次注意变量 dinospinner 和 dinospinner2 的颜色。有白色表示当前函数的局部(在本例中为 OnCreate)。因此,您将无法在 onCreate 之外调用它们。 我们可以在第 162 行看到 dinospinner 是紫色的: 它是紫色的,因为您引用了属性 1 但它没有被分配,所以当代码被执行时,它会因为 NullPointerException 而崩溃,因为它从未被分配过。 为了让它工作,你应该在第 41 和 42 行删除 Spinner
但即使现在有了这个版本,下一个活动 (Trinkspiel2spieler) 不会打开。我现在真的不知道该怎么办。我真的很抱歉 打扰你这么多,但如果你能,我真的很感激 帮帮我。
在下一个活动中,我没有看到有关您的临时演员的更新。如果你想要你的第一个微调器值,如果我更新我的 anwser,你至少应该使用键“EXTRA_DINO1”来获取它:
String firstSpinnerVal = getIntent().getStringExtra(Constants.EXTRA_DINO1);
请注意,“EXTRA_DINO1”应在常量中定义,而不是在您的活动中。
在我这边,我能够毫无问题地启动下一个活动。你能更准确吗?到底是怎么回事?没有什么?你有一些领先的日志吗?
无论如何,我认为您最初的问题已得到解答。如果您需要更多帮助,我建议您例如将代码上传到存储库并与我分享。您可以更轻松地查看代码并提供帮助。
由于您似乎开始使用 android,我建议您使用 codelab 来提高您的技能: https://developer.android.com/courses/fundamentals-training/toc-v2?authuser=1
请看一下这个: https://www.tutorialspoint.com/what-is-a-variable-field-property-in-java
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。