Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Όπως λέει ο τίτλος, είχα γράψει σε java γεννήτρια τυχαίων αριθμών στυλ Τζοκερ, δλδ 5 αριθμοί από 1-45 και ένας αριθμός από 1-20.

 

Ενώ στη Java λειτουργεί κανονικά, στο Android εμφανίζει μόνο τον έναν αριθμό απο τους 5 + τον εξτρα αριθμό απο 1-20.

 

Τι κάνω λάθος? (είμαι εντελώς καινούριος Android,οπότε να είστε επιεικείς) 

 

Υ.Γ: Ο κώδικας μου είναι στη onCreateOptionsMenu(Menu menu)

public class MainActivity extends ActionBarActivity {

	Button button1;	
	TextView display;
	TextView show;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		
		button1 = (Button) findViewById(R.id.b1);		
		display = (TextView) findViewById(R.id.display);
		show = (TextView) findViewById(R.id.show);

		
		button1.setOnClickListener(new OnClickListener() {
						
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
									
				Random ran = new Random();

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	display.setText(" " + x);
			    }
			    show.setText(" | "+ (ran.nextInt(20)+1));
			}
		});
		
		return true;
	}
		
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}
Δημοσ.

Τι κάνεις εδώ για σκέψου:

for(int i = 0; i < 5; i++) {
                 int x = al.remove(ran.nextInt(al.size()) );
                 display.setText(" " + x);
}

Σε κάθε iteration επιλέγεις μια τιμή απο τις 45 και την αναθέτεις στη μεταβλητή x. Μετά λες στο TextView σου setText(" " + x). Τι κάνει αυτό; Σβήνει τα προηγούμενα και εμφανίζει ότι του λες. Δεν θέλεις αυτό. Θέλεις ή να χρησιμοποιήσεις την μέθοδο append (δηλαδή κάθε φορά να κολάς το καινούργιο String. Η θα δημιουργήσεις ΜΙΑ φορά ένα String το οποίο θα έχει και τα 5 νούμερα(Hint: με StringBuilder όχι String concatenation) και θα κάνεις αυτό setText.

 

Υ.Γ. η μέθοδος στην οποία έχεις επιλέξει να βάλεις τη λογική του App σου δεν είναι...και η πιο ενδεδειγμένη. Δεν υπάρχει λόγος να τα κάνεις initialize τα compnents σου κάθε φορά που πατάς το Menu Button. Αυτά πάνε καλύτερα στη μέθοδο onCreate().

  • Like 1
Δημοσ.

Ευχαριστώ! Θα τα κοιτάξω και τα 2 και διαλέγω ανάλογα...
Μάλλον βιάστηκα να αρχίζω να φτιάχνω την εφαρμογή αφού δεν ξέρω ακόμα όλα τα βασικά (πχ για τη μέθοδο που είπες για να χρησιμοποιώ καλύτερα την onCreate και για τη χρήση setText).

 

Java ξεκίνησα να μαθαίνω για χάρη του Android,οπότε γι'αυτό και η λαχτάρα μου να φτιάξω app.

Δημοσ.

 

Σε κάθε iteration επιλέγεις μια τιμή απο τις 45 και την αναθέτεις στη μεταβλητή x. Μετά λες στο TextView σου setText(" " + x). Τι κάνει αυτό; Σβήνει τα προηγούμενα και εμφανίζει ότι του λες. Δεν θέλεις αυτό. Θέλεις ή να χρησιμοποιήσεις την μέθοδο append (δηλαδή κάθε φορά να κολάς το καινούργιο String. Η θα δημιουργήσεις ΜΙΑ φορά ένα String το οποίο θα έχει και τα 5 νούμερα(Hint: με StringBuilder όχι String concatenation) και θα κάνεις αυτό setText.

 

Υ.Γ. η μέθοδος στην οποία έχεις επιλέξει να βάλεις τη λογική του App σου δεν είναι...και η πιο ενδεδειγμένη. Δεν υπάρχει λόγος να τα κάνεις initialize τα compnents σου κάθε φορά που πατάς το Menu Button. Αυτά πάνε καλύτερα στη μέθοδο onCreate().

 

 

Το άλλαξα, με τη μέθοδο append το εμφανίζει μια χαρά,ΑΛΛΑ 1)όταν ξαναπατάω το κουμπί μου εμφανίζει τους αριθμούς δίπλα στους παλιούς... (Θα δείτε λίγο πριν το τέλος οτι έβαλα τη clear() μήπως σβήσω τους παλιούς αριθμούς,αλλα δεν...)

 

Επίσης,2) τώρα που έβαλα τον κώδικα στην OnCreate, μου βγάζει σφάλμα οτι η εφαρμογή σταμάτησε...

 

Ισως βιάζομαι,απλά βοηθήστε με σε αυτό και είναι έτοιμη η εφαρμογή (θα την ανεβάσω κι εδω να τη δείτε με γραφικά κλπ)

Απλά πριν προχωρήσω και με τη Java και με Android θέλω να φτιάξω αυτό το απλό πράγμα!

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		button1 = (Button) findViewById(R.id.b1);		
		display = (TextView) findViewById(R.id.display);
		show = (TextView) findViewById(R.id.show);

		
		button1.setOnClickListener(new OnClickListener() {
						
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
									
				Random ran = new Random();

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	display.append(" " + x + " ");
			    }
			    show.setText(" || "+ (ran.nextInt(20)+1));
			    al.clear();
			}
		});
		
		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
	}
Δημοσ.

Στους εμφανίζει ξανά γιατί η εντολή append προσθέτει κείμενο στο ήδη υπάρχον, δεν το αντικαθιστά. Όταν λοιπόν ξαναπατάς το κουμπί, κάθε φορά προστίθενται άλλοι 5 αριθμοί. Θα πρέπει λοιπόν να βάλεις μια συνθήκη στην onClick που να ελέγχει αν η Textview είναι κενή, και αν δεν είναι να την θέτει ως κενή, πριν εκτελεστεί το loop.

Δημοσ.

 

Το άλλαξα, με τη μέθοδο append το εμφανίζει μια χαρά,ΑΛΛΑ 1)όταν ξαναπατάω το κουμπί μου εμφανίζει τους αριθμούς δίπλα στους παλιούς... (Θα δείτε λίγο πριν το τέλος οτι έβαλα τη clear() μήπως σβήσω τους παλιούς αριθμούς,αλλα δεν...)

 

Επίσης,2) τώρα που έβαλα τον κώδικα στην OnCreate, μου βγάζει σφάλμα οτι η εφαρμογή σταμάτησε...

 

Ισως βιάζομαι,απλά βοηθήστε με σε αυτό και είναι έτοιμη η εφαρμογή (θα την ανεβάσω κι εδω να τη δείτε με γραφικά κλπ)

Απλά πριν προχωρήσω και με τη Java και με Android θέλω να φτιάξω αυτό το απλό πράγμα!

 

Δεν υπάρχει λόγος να σου κρασάρει η εφαρμογή μόνο με τις συγκεκριμένες αλλαγές - να πάει ο κώδικας μέσα στην onCreate(). Υποθέτω θα κάνεις κάποιο field instantiate γι'αυτό θα σκάει.

Δημοσ.

Για το σφάλμα δεν μπόρεσα να βρω τι κάνω λάθος...

για τον κώδικα πάντως έβαλα StringBuilder και μετά ότι έκανα...

ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	s.append(" " + x + " "); // Το "s" είναι το αντ. StringBuilder
			    	display.setText(s);
			    }
			    show.setText(" || "+ (ran.nextInt(20)+1));
Δημοσ.

 

Για το σφάλμα δεν μπόρεσα να βρω τι κάνω λάθος...

για τον κώδικα πάντως έβαλα StringBuilder και μετά ότι έκανα...

ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	s.append(" " + x + " "); // Το "s" είναι το αντ. StringBuilder
			    	display.setText(s);
			    }
			    show.setText(" || "+ (ran.nextInt(20)+1));

 

Κάνε ένα Post όλο το αρχείο, dont worry τσάμπα είναι ο χώρος :)

Δημοσ.

Οκ, εσύ το ζήτησες... :P

 

Βασικά αυτό που θα βάλω είναι μαζί και με μια άλλη "γεννήτρια" αριθμών (Λοττο).

Ακομα δεν παίζει στην OnCreate αλλά στην άλλη βγαίνουν μαζί οι αριθμοί... και παρόλο που έχω setText, πάλι βγαίνει η μία πάνω στην άλλη! (Οτι κωδικα εχω βάλει εγω ειναι στην onCreateOptionsMenu(Menu menu) ).
 

Ενώ σε Java το είχα έτοιμο,σε Android μου έχει σπάσει τα νεύρα...Σίγουρα κάνω κάτι λαθος(και) στην XML!

 

Υ.Γ: Θα τα ξανακοιτάξω αύριο το μεσημέρι πάλι απο την αρχή...ελπίζω να έχει βγάλει κάποιος άκρη!


import java.util.ArrayList;
import java.util.Random;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
	
	Button button1;	
	Button button2;
	TextView display;
	TextView show;
	TextView joke;
	
	Random ran = new Random();
	StringBuilder s = new StringBuilder();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		
		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
		
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		
		button1 = (Button) findViewById(R.id.b1);		
		button2 = (Button) findViewById(R.id.b2);
		display = (TextView) findViewById(R.id.display);
		show = (TextView) findViewById(R.id.show);
		joke = (TextView) findViewById(R.id.joke);

		
		button1.setOnClickListener(new OnClickListener() {
						
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
									

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	s.append(" " + x + " ");
			    	display.setText(s);
			    }
			    show.setText(" || "+ (ran.nextInt(20)+1));

			    
			}
		});
		
		button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
									

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 49; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 6; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	s.append(" " + x + " ");
			    	joke.setText(s);
			    }
			    
			    
			}
		});
		
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}

Δημοσ.

Δεν καταλαβαίνω γιατί όταν μεταφέρεις τον κώδικα στην onCreate() σου κρασάρει...εκτός αν μεταφέρεις και το        getMenuInflater().inflate(R.menu.main, menu); το οποίο δεν πρέπει.

 

Τώρα για το άλλο θέμα. Τι θέλεις; Κάθε φορά που πατάει κάποιος το κουμπί να γίνονται reset τα πεδία και να σου δείχνει νέους αριθμούς. Ε βάλτο με το που πατάς click ένα setText(""); και μετά τα loops και όλα τα άλλα. Απλό ;).

button2.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                 //με το που γίνεται το click ορίζουμε
                 // το πεδίο που μας ενδιαφέρει ως κενό String 
                 joke.setText("");
                 ArrayList<Integer> al = new ArrayList<Integer>();
                 for(int i = 1; i <= 49; i++)
                 al.add(i);
            
                 for(int i = 0; i < 6; i++) {
                    int x = al.remove(ran.nextInt(al.size()) );
                     s.append(" " + x + " ");
                 }
                 //έξω απο το loop αυτό, στο loop χτίζουμε το string 
                 //και μόλις το δημιουργούμε τότε το κολλάμε .
                 joke.setText(s);
             }         
});
Δημοσ. (επεξεργασμένο)

Έκανα διόρθωση (έφτιαξα ξεχωριστό StringBuilder για τη 2η onClick) και έτσι εμφανίζει τους νέους αριθμούς στη θέση των προηγούμενων.

 

Εχω    1 προβλημα:

 

1) Γιατι ο κώδικας ενώ παίζει στην onCreateOptionsMenu(Menu menu) δεν παίζει ακριβώς ίδιος στην OnCreate?

(ποστάρω πάλι όλον τον κώδικα)

 

2) Όταν εχω πατήσει να βγουν αριθμοί και το κινητό γυρίσει σε οριζόντιο προσανατολισμό τότε φαίνεται η οθόνη όπως όταν ξεκίνησε η εφαρμογή. Τι μπορώ να κάνω γι'αυτό?

Αν πχ απενεργοποιήσω να αλλάζει προσανατολισμό.. (πως?)   (Λύθηκε με android:screenOrientation="portrait" στο Μανιφεστ)

package com.etking.winninglotterynumbers;

import java.util.ArrayList;
import java.util.Random;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
	
	Button button1;	
	Button button2;
	TextView display;
	TextView show;
	TextView joke;
	
	Random ran = new Random();
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		
		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
		
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		
		button1 = (Button) findViewById(R.id.b1);		
		button2 = (Button) findViewById(R.id.b2);
		display = (TextView) findViewById(R.id.display);
		show = (TextView) findViewById(R.id.show);
		joke = (TextView) findViewById(R.id.joke);

		
		button1.setOnClickListener(new OnClickListener() {
						
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				StringBuilder s = new StringBuilder();

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 45; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 5; i++) {
			    	int x = al.remove(ran.nextInt(al.size()) );
			    	s.append("  " + x + "  ");
			    	display.setText(s);
			    }
			    show.setText(" |  "+ (ran.nextInt(20)+1));

			    
			}
		});
		
		button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				StringBuilder sb = new StringBuilder();

				ArrayList<Integer> al = new ArrayList<Integer>();
			    for(int i = 1; i <= 49; i++)
			        al.add(i);
			    
			    for(int i = 0; i < 6; i++) {
			    	int y = al.remove(ran.nextInt(al.size()) );
			    	sb.append("  " + y + "  ");
			    	
			    }
			    
			    joke.setText(sb);
			}
		});
		
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}

Επεξ/σία από tazos87

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...