2017-02-08 4 views
0

EDIT: Siehe mitgeliefertes Fehlerprotokoll.Rollen eines Würfels basierend auf der Anzahl der Seiten

Ich versuche, eine einfache App zu erstellen, um verschiedene Seitenwürfel in Android Studio zu rollen. Dies ist mein Code so weit: MainActivity.java

package com.example.thomb.tutorialspoint; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.TextView; 

import java.util.Random; 

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button button = (Button) findViewById(R.id.buttonRoll); 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      int roll = RollDice(sidesChosen); 
      TextView tv1 = (TextView)findViewById(R.id.textView); 
      tv1.setText(roll); 
      setContentView(tv1); 
     } 
    }); 
} 

public int sidesChosen; 
public int RollDice(int sides) { 
    Random r = new Random(); 
    return r.nextInt(sides)+1; 
} //method 
public void onRadioButtonClicked(View view) { 
    // Is the button now checked? 
    boolean checked = ((RadioButton) view).isChecked(); 

    // Check which radio button was clicked 
    switch(view.getId()) { 
     case R.id.radioButtonD4: 
      if (checked) 
       sidesChosen = 4; 
       break; 
     case R.id.radioButtonD6: 
      if (checked) 
       sidesChosen = 6; 
       break; 
     case R.id.radioButtonD8: 
      if (checked) 
       sidesChosen = 8; 
       break; 
     case R.id.radioButtonD10: 
      if (checked) 
       sidesChosen = 10; 
       break; 
     case R.id.radioButtonD12: 
      if (checked) 
       sidesChosen = 12; 
       break; 
     case R.id.radioButtonD20: 
      if (checked) 
       sidesChosen = 20; 
       break; 
    } //switch 
} //method 
} //class 

Dies ist, wie das Layout wie folgt aussieht: Abstürze http://i.imgur.com/IeIbMlz.png

Die App, wenn ich die Rolle Schaltfläche klicken, aber ich habe keine Ahnung, warum . Die IDs sind alle korrekt und die Optionsfelder funktionieren wie erwartet. Ich benutze API Level 25. Ich bin ziemlich neu in Java, aber ich bin ziemlich vertraut mit C#, so dass das Problem in der Code-Syntax liegen kann, obwohl Android Studio keine Fehler meldet. Lassen Sie mich wissen, wenn Sie das XML für das Layout auch sehen müssen.

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.thomb.tutorialspoint, PID: 5029 
       java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
        at android.view.ViewGroup.addViewInner(ViewGroup.java:4310) 
        at android.view.ViewGroup.addView(ViewGroup.java:4146) 
        at android.view.ViewGroup.addView(ViewGroup.java:4087) 
        at android.view.ViewGroup.addView(ViewGroup.java:4060) 
        at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:279) 
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:145) 
        at com.example.thomb.tutorialspoint.MainActivity$1.onClick(MainActivity.java:25) 
        at android.view.View.performClick(View.java:5280) 
        at android.view.View$PerformClick.run(View.java:21239) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:234) 
        at android.app.ActivityThread.main(ActivityThread.java:5526) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Haben Sie das Logcat beim Ausführen der App verwendet? Sie müssen mehr Informationen über den Absturz geben, der Logcat würde sagen, warum es abstürzt. –

+0

Wenn Sie mit C# vertraut sind, gehe ich davon aus, dass Sie auch mit dem Debuggen vertraut sind. Wenn die App abstürzt, wird ein Absturzbericht erstellt, der angibt, was den Absturz und andere sehr nützliche Daten verursacht hat. Fange an, den Absturzbericht zu untersuchen und wenn du immer noch Probleme hast, kannst du es hier posten. –

+0

für mich sieht der Code unvollständig aus. Was ist R? Was ist R.id mit all den Kontrollkästchen ... sind das die Steuerelemente, oder bereits boolesche Werte? Es R.id.radioButtonD4 ist der Radiobutton, Sie müssen die ID (oder den Namen) der Radios in Ihren Case-Anweisungen erhalten. –

Antwort

3

setText() ist eine überladene Methode mit zwei Arten: eine, die die andere eine int in einem String nimmt. Die int hier sollte Zeichenfolge Ressourcen-ID sein. Hier ist dein Fehler. Im folgenden Code verwenden Sie setText(int), übergeben aber keine gültige Zeichenfolge-Ressourcen-ID.

int roll = RollDice(sidesChosen); 
... 
tv1.setText(roll); 

setText(String.valueOf(roll) Tun Sie es zuerst

EDIT nach log Post in einen String zu konvertieren:

Die Ursache des Fehlers ist, dass Sie 0 auf dem nextInt() Methode vorbei sind. Dies kann passieren, weil Sie noch nie einen RadioButton ausgewählt haben (standardmäßig ist sidesChoose 0) oder dass selbst nach dem Auswählen eines RadioButtons keiner der case s von switch eingegeben wird.

EDIT nach dem zweiten Protokoll Beitrag: (...)

entfernen setContentView(tv1); Dies wird verwendet, um ein Layout eine Aktivität zu befestigen. Warum benutzt du es hier?

+0

Danke, das werde ich mir merken! Ich habe immer noch einen Fehler. Es scheint, dass es mit der Verwendung der Random-Klasse zusammenhängen könnte. – Leth

+0

Nun, ich sehe Ihr Fehlerprotokoll jetzt.Nachdem Sie das behoben haben, ist dies das nächste, dem Sie begegnen würden :) –

+0

Yup, ich habe die TextView- und Random-Fehler behoben, aber ich erhalte jetzt eine neue, die ich in den ursprünglichen Post eingefügt habe. – Leth

1

Es scheint, dass Sie 0 an die Methode Random.nextInt() übergeben, die nicht zulässig ist.

java.lang.IllegalArgumentException: n <= 0: 0 
       at java.util.Random.nextInt(Random.java:182) 

Dies geschieht, wenn keine Ihrer case Zweige erreicht ist. Es scheint also, dass etwas nicht stimmt mit dem Umgang mit den Radio Button Klicks.

Verwandte Themen