2017-08-03, 10:06
  #1
Medlem
Facades avatar
Tjena,

Jag är ny på java och håller helt enkelt på med en app som spelar upp ljud vid tryckning på en knapp.
Jag har 17 olika ljudfiler i min raw mapp och gör en randomisering av en INT mellan 1 och 17 och beroende på vad den blir så väljer jag ett case, sätter en MediaPlayer till den ljudfilen som anropas i det caset och sedan spelas det upp.
Men allt detta i min MainActivity blir väldigt stort, speciellt när jag kommer bygga på med fler ljudfiler.
Så jag vill lägga denna i en annan java klass och sedan anropa denna klassen från MainActivity när knappen för att spela ljuden är tryckt. Den skall inte heller öppna en ny acitivity ruta eller liknande. Enbart spela upp ljudet.

Hur kan jag lösa det? Hur ska klassen se ut?
Jag försökte med lite olika saker men jag förstår inte hur jag skall bygga upp klassen.

Jag kom så långt att jag fick ett anrop via MainActivity att starta den klassen, men istället för att spela upp ljud så öppnade den bara en tom activity ruta.
Jag använde mig av startActivity(xxx);
Citera
2017-08-03, 10:29
  #2
Medlem
Kenny Kuks avatar
Skapa bara en ny java class i samma paket. Om du döper klassen till MinKlass kan du sedan skapa den ni din Activity genom
Kod:
MinKlass minKlass = new MinKlass();
Citera
2017-08-03, 11:51
  #3
Medlem
Hur ser din kod ut? Hur ser det ut när du påkallar att spela upp ljudet, och hur ser koden för att spela upp ut?
Citera
2017-08-03, 16:31
  #4
Medlem
Facades avatar
Citat:
Ursprungligen postat av Kenny Kuk
Skapa bara en ny java class i samma paket. Om du döper klassen till MinKlass kan du sedan skapa den ni din Activity genom
Kod:
MinKlass minKlass = new MinKlass();

Jag har kommit så långt att jag förstår den biten.
Men hur jag skall definera den andra klassen förstår jag mig inte på.
Och anropet i klassen SoundPlayer som går såhär: MediaPlayer.create(SoundPlayer.this [...]" klagar den på SoundPlayer.this.
Jag vet inte riktigt vad jag skall ha där, och jag förstår inte heller. Allt jag vill komma på är "R.raw.[...]
Error jag får är "xxx cannot be resolved from a static context".

Citat:
Ursprungligen postat av Gottisborgen
Hur ser din kod ut? Hur ser det ut när du påkallar att spela upp ljudet, och hur ser koden för att spela upp ut?

Hittils ser det ut såhär:

min Main Activity:
Kod:
public class Main extends AppCompatActivity {

    // Keep it away from the garbage collector
    MediaPlayer chooseSound = new MediaPlayer();

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

        // Set the toolbar style & design
        Toolbar mainToolbar = (Toolbar) findViewById(R.id.customToolbar);
        // Set the toolbar title
        mainToolbar.setNavigationIcon(R.drawable.meow_logo);
        // Activate toolbar
        setSupportActionBar(mainToolbar);

        final Switch switchRepeat = (Switch) findViewById(R.id.switchRepeat);

        // Set the button to local variable
        Button playMeow = (Button) findViewById(R.id.button_Meow);

        playMeow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SoundPlayer sound = new SoundPlayer();
                sound.soundPlayerMethod();
            }
        });

Och detta är klassen SoundPlayer som jag försöker anropa:
Kod:
class SoundPlayer extends MediaPlayer {

    //public void soundPlayerMethod(Context context){
    static void soundPlayerMethod(){

        // Create variable for sound
        MediaPlayer chooseSound = new MediaPlayer();
        // Release last media, DOES NOT WORK SO FAR!!!
        chooseSound.release();

        int max = 17;
        int min = 1;

        // Randomize playbacks of cats
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;
        //switch (n){
        switch (randomNum) {
            case 1:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_1);break;}
            case 2:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_2);break;}
            case 3:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_3);break;}
            case 4:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_4);break;}
            case 5:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_5);break;}
            case 6:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_6);break;}
            case 7:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_7);break;}
            case 8:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_8);break;}
            case 9:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_9);break;}
            case 10:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_10);break;}
            case 11:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_11);break;}
            case 12:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_12);break;}
            case 13:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_13);break;}
            case 14:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_14);break;}
            case 15:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_15);break;}
            case 16:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_16);break;}
            case 17:{ chooseSound = MediaPlayer.create(SoundPlayer.this, R.raw.meow_17);break;}
        }

        //Switch switchRepeat = (Switch) findViewById(R.id.switchRepeat);

        // Play the sound
        chooseSound.start();

    }
}


Känns sjukt dumt för jag vet vad jag vill göra, men jag förstår verkligen hur det ska lösas. Googlar som en galning och känns som att jag försöker allt trots att knappt ens förstår hälften om vad det är eller varför man ens gör så. Känns som att jag försöker lära mig ryska genom att bara läsa en bok på ryska. Även om jag läst ut boken så har jag ändå inte lärt mig ett enda ord.
Finner ingen lösning på någonting som troligtvis är riktigt simpelt.
__________________
Senast redigerad av Facade 2017-08-03 kl. 17:15.
Citera
2017-08-03, 17:22
  #5
Medlem
Facades avatar
Nu fick jag till det!

Men jag förstår inte varför detta fungerar, kan ni vara vänliga och förklara varför jag var tvungen att göra såhär och varför det inte gick som jag försökte göra innan?

i Main bytte jag ut
Kod:
            public void onClick(View v) {
                SoundPlayer sound = new SoundPlayer();
                sound.soundPlayerMethod();
mot
Kod:
            public void onClick(View v) {
                SoundPlayer sound = new SoundPlayer();
                sound.soundPlayerMethod(Main.this);


och i SoundPlayer lade jag in en Context som inargument (heter det så?) och sedan lade contexten i MediaPlayer.Create till den Contexten som blev inargument.

det blev såhär:
Kod:
class SoundPlayer extends MediaPlayer {

    public static void soundPlayerMethod(Context context){
    //private void soundPlayerMethod(){

        // Create variable for sound
        MediaPlayer chooseSound = new MediaPlayer();
        // Release last media, DOES NOT WORK SO FAR!!!
        chooseSound.release();

        //chooseSound = MediaPlayer.create(context, R.raw.meow_1);

        int max = 17;
        int min = 1;

        // Randomize playbacks of cats
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;
        //switch (n){
        switch (randomNum) {
            case 1:{ chooseSound = MediaPlayer.create(context, R.raw.meow_1);break;}
            case 2:{ chooseSound = MediaPlayer.create(context, R.raw.meow_2);break;}
            case 3:{ chooseSound = MediaPlayer.create(context, R.raw.meow_3);break;}
            case 4:{ chooseSound = MediaPlayer.create(context, R.raw.meow_4);break;}
            case 5:{ chooseSound = MediaPlayer.create(context, R.raw.meow_5);break;}
            case 6:{ chooseSound = MediaPlayer.create(context, R.raw.meow_6);break;}
            case 7:{ chooseSound = MediaPlayer.create(context, R.raw.meow_7);break;}
            case 8:{ chooseSound = MediaPlayer.create(context, R.raw.meow_8);break;}
            case 9:{ chooseSound = MediaPlayer.create(context, R.raw.meow_9);break;}
            case 10:{ chooseSound = MediaPlayer.create(context, R.raw.meow_10);break;}
            case 11:{ chooseSound = MediaPlayer.create(context, R.raw.meow_11);break;}
            case 12:{ chooseSound = MediaPlayer.create(context, R.raw.meow_12);break;}
            case 13:{ chooseSound = MediaPlayer.create(context, R.raw.meow_13);break;}
            case 14:{ chooseSound = MediaPlayer.create(context, R.raw.meow_14);break;}
            case 15:{ chooseSound = MediaPlayer.create(context, R.raw.meow_15);break;}
            case 16:{ chooseSound = MediaPlayer.create(context, R.raw.meow_16);break;}
            case 17:{ chooseSound = MediaPlayer.create(context, R.raw.meow_17);break;}
        }

        //Switch switchRepeat = (Switch) findViewById(R.id.switchRepeat);

        // Play the sound
        chooseSound.start();

    }
}


Jag hoppas jag inte rörde till det.
Citera
2017-08-03, 19:46
  #6
Medlem
SoundPlayer.this refererar till den instans av SoundPlayer som metoden är bunden till. En metod som är deklarerad static är inte bunden till någon instans. Därav kompileringsfelet.

Läs om closures om du är osäker på vad jag menar.
Citera
2017-09-27, 23:31
  #7
Medlem
kjellbrels avatar
Ursäkta så sent svar på den här tråden. Jag verkar ha en förmåga att var sent ute just i den här delen av forumet.
Citat:
Ursprungligen postat av Facade
Jag hoppas jag inte rörde till det.
Du rörde till det ordentligt på väldigt många sätt. Ifall det fortfarande skulle vara intressant kan vi gå igenom dem. Säg till i så fall.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in