Naar content
Trending apps
  • Google Duo: videogesprekken van hoge kwaliteit

  • Gmail

  • Maps: Navigatie en OV

  • WhatsApp Messenger

  • Messenger: gratis sms'en en videobellen

Trending games
  • Fortnite

  • Minecraft Earth

  • Dr. Mario World

  • Harry Potter: Wizards Unite

  • Breaking Bad: Criminal Elements

Trending smartphones
  • OnePlus Nord N10 5G

  • POCO X3

  • Google Pixel 5

  • Google Pixel 4a

  • OnePlus Nord

Nieuwste tablets
  • Samsung Galaxy Tab S6

  • Samsung Galaxy Tab A 10.5

  • Samsung Galaxy Tab S4

  • Samsung Galaxy Tab S3 9.7

  • Asus Zenpad 3S 10

Wij werken momenteel aan een nieuw forum voor Androidworld. Het is daarom momenteel niet mogelijk om te reageren of nieuwe topics aan te maken.

CCC

  • Lid sinds 04 januari 2012
  • Berichten 5
  • Reputatie 0
  • #1
  • 16 januari 2012
  • 20:50

Hallo,

Ik ben de laatste tijd een beetje bezig geweest met het programmeren van android apps. Nu loop ik echter vast met twee spinners die ik in mn app heb zitten. Het is een simpele converter app die de opgegeven snelheid in verschillende eenheden kan uitdrukken (kph,mph,ms). Alleen heb ik geen idee hoe je kan verwijzen naar de items die in de string array staan van je spinners. Ik ben nogal een beginner in programmeren dus het kan zijn dat ik een hele domme vraag stel

hier is de code:

package android.development.learning;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class CarSpecConverter2Activity extends Activity {

EditText editText1;
Button button1;
Spinner spinner1;
Spinner spinner2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

editText1 = (EditText) findViewById (R.id.editText1);
button1 = (Button) findViewById (R.id.button1);
spinner1 = (Spinner) findViewById (R.id.spinner1);
spinner2 = (Spinner) findViewById (R.id.spinner2);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.speed_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(adapter);

ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
this, R.array.speed2_array, android.R.layout.simple_spinner_item);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapter1);

spinner1.setOnItemSelectedListener(new MyOnItemSelectedListener());
spinner2.setOnItemSelectedListener(new MyOnItemSelectedListener1());
}
public void calculate(View view){
if (view == button1){
if ((????=="mph")==(????=="kph")) {
float mph = Float.valueOf(editText1.getText().toString());
float kph = (float) 1.6 * mph;
Toast.makeText(this, mph + " mph is hetzelfde als " + kph + " kph.", Toast.LENGTH_LONG).show();

}
}
}
}

Bij die ???? weet ik dus niet wat ik moet invullen om te kunnen verwijzen naar de items uit de spinners.

En hier de MyOnItemSelectedList class (zijn er twee, zijn alleen precies hetzelfde):

package android.development.learning;

import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;

public class MyOnItemSelectedListener implements OnItemSelectedListener {

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {

}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}
}

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="hello">Hello World, CarSpecConverter2Activity!</string>
<string name="app_name">Car Spec Converter2</string>
<string name="speed">number</string>
<string-array name="speed_array">
<item>mph</item>
<item>kph</item>
<item>ms</item>
</string-array>
<string name="speed2">number</string>
<string-array name="speed2_array">
<item>mph</item>
<item>kph</item>
<item>ms</item>
</string-array>
</resources>


Alvast bedankt!

Bewerkt (24 april 2013 14:04)

fifarunnerr

  • Lid sinds 13 juli 2010
  • Berichten 1846
  • Reputatie 10
  • #2
  • 16 januari 2012
  • 21:19

Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
int position = spinner1.getSelectedItemPosition();

Dan heb je de positie van het geselecteerde item. Is dat het zetje wat je nodig hebt of wil je er nog een?

Ik kan je namelijk wel direct alle code geven, maar persoonlijk vind ik het leuker om een klein zetje te krijgen en de rest dan zelf werkend te krijgen.

Bewerkt (24 april 2013 14:04)

CCC

  • Lid sinds 04 januari 2012
  • Berichten 5
  • Reputatie 0
  • #3
  • 16 januari 2012
  • 21:58

Bedankt voor je snelle reactie!
Ik kom er nog niet helemaal uit.. Ik neem aan dat

int position = spinner1.getSelectedItemPosition();

moet worden geschreven in de onItemSelected method, alleen dan herkent eclipse spinner1 niet, dus dan schrijf ik er Spinner spinner1; bij. En als ik

Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);

in mn MyOnItemSelectedListener class schrijf, moet ik een findViewById method aanmaken waardoor ik een beetje de kluts kwijt raak.. En ik weet ook niet precies wat ik nu ipv de ???? moet schrijven, als ik position schrijf, staat er dat het niet kan worden toegekend aan een variable terwijl int position dit toch zou moeten definieren?

Bewerkt (24 april 2013 14:04)

IvoJanssen

  • Lid sinds 25 februari 2010
  • Berichten 275
  • Reputatie 0
  • #4
  • 17 januari 2012
  • 00:19

Beste kun je aanwennen als je een variable vaker nodig hebt (bij onClicks ed), om dat bovenaan de klasse te zetten.

Bovenaan de klasse:

private Spinner spinner1;

in onCreate:
spinner1 =[COLOR=#333333] (Spinner) findViewById(R.id.spinner1);

Daarna kun je overal die spinner1 gebruiken, ook in je onClick.

Bewerkt (24 april 2013 14:04)

fifarunnerr

  • Lid sinds 13 juli 2010
  • Berichten 1846
  • Reputatie 10
  • #5
  • 17 januari 2012
  • 11:32

CCC;259413
Bedankt voor je snelle reactie!
Ik kom er nog niet helemaal uit.. Ik neem aan dat

int position = spinner1.getSelectedItemPosition();

moet worden geschreven in de onItemSelected method, alleen dan herkent eclipse spinner1 niet, dus dan schrijf ik er Spinner spinner1; bij. En als ik

Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);

in mn MyOnItemSelectedListener class schrijf, moet ik een findViewById method aanmaken waardoor ik een beetje de kluts kwijt raak.. En ik weet ook niet precies wat ik nu ipv de ???? moet schrijven, als ik position schrijf, staat er dat het niet kan worden toegekend aan een variable terwijl int position dit toch zou moeten definieren?

Oke, dan zal ik het wat uitgebreider vertellen.

Er zijn 2 dingen die je kan doen. In de methode onItemSelected wordt ook de nieuwe geselecteerde positie weergegeven. Dat is die integer die je bij de methode meekrijgt. Bij jou heet die arg2.
Je kan zeggen: als de methdoe onItemSelected wordt aangeroepen dan wil ik dat een veld wordt geüpdate en dat daar de nieuwste waarde in staat.
Wat ook kan: Zodra ik moet weten wat er in de spinner staat vraag ik dat op. In dat laatste geval heb je die onItemSelected methode helemaal niet nodig.

Persoonlijk haal ik die data liever op als ik het nodig heb, dan weet ik in ieder geval zeker dat ik de laatste waarde heb. Wat zou er namelijk gebeuren als je nog niets hebt geselecteerd in die Spinner, dan wordt die methode misschien helemaal niet eens aangeroepen en klopt de waarde niet. Bovendien, als een gebruiker 10x de data in die spinner aanpast moet dat veld(wat je bij onItemSelected dan aanpast) ook 10x aangepast worden.


Op het moment dat je die calculate methode aanroept moet je dus weten wat er in spinner1 en wat er in spinner2 staat. Dat kan je ook op 2 manieren doen. Je kan zeggen:
- Aangezien de volgorde in die Array altijd hetzelfde is weet ik dat als de spinner op positie 0 zit, dat mph is geselecteerd. In zo'n geval kan je gewoon het positie(getal) gewoon gebruiken. Als je dan ‘mph’ veranderd in ‘Mph’ of ‘M/h’ dan hoef je verder in je code niets te veranderen.
- Wat ook kan: Ik vraag de positie van die spinner op, en tegelijkertijd vraag ik op wat er op die positie in de array staat. Dit is waar je op dit moment mee bezig bent. Met deze code haal je de array op.
String[] speedArray = this.getResources().getStringArray(R.array.speed_array);
Je kan dus nu zeggen, speedArray geeft mij een waarde terug. Dat is of mph, kph, of ms. Dat ga ik vergelijken. Als je hier ‘mph’ veranderd naar ‘MpH’ dan moet je wel de code aanpassen. Maar hier moet je dan geen code aanpassen als je de volgorde van de lijst veranderd.

Overigens: Strings moet je vergelijken met de string.equals(strings) methode, aangezien == niet altijd het juiste resultaat geeft. Meestal gaat dat wel goed, maar equals werkt altijd. Dit zorgt overigens ook voor ‘hogere kwaliteit’ code.
Ook heb je aan 1 string-array in dit geval genoeg, omdat ze er exact hetzelfde zijn.

Bewerkt (24 april 2013 14:04)

CCC

  • Lid sinds 04 januari 2012
  • Berichten 5
  • Reputatie 0
  • #6
  • 17 januari 2012
  • 23:00

Oké, dus als ik deze code invul bij de onItemSelected method:

String[] speedArray = this.getResources().getStringArray(R.array.speed_array);
int position = spinner1.getSelectedItemPosition();

kun je met speedArray verwijzen naar de waarde die in spinner1 is geselecteerd. Ik krijg alleen een rood kringeltje onder getResources, om dit op te lossen moet ik een aparte method aanmaken, waarom? En als ik hetzelfde stuk code van hierboven invul in mn MainActivity gebeurt dit niet. Ik krijg het idee dat alles niet echt klopt met elkaar doordat ik 3 verschillende classes heb (MainActivity, MyOnItemSelectedListener, MyOnItemSelectedListener1), of moet dit gewoon kunnen kloppen?

Bewerkt (24 april 2013 14:04)

Reageer

We werken momenteel hard aan een nieuw forum voor Androidworld. Het is daarom helaas niet mogelijk om op dit topic te reageren.