Archivi delle categorie:Coma creare un app
I Layout
I layout sono elementi visivi di una attività in
cui le componenti grafiche sono posizionate
all’interno di una vista contenuta nei
file XML della cartella res/layout.
Ecco i layout maggiormente utilizzati:
Linear Layout permette di inserire i diversi elementi della pagina come Button, TextView, EditText,ecc… in righe orizzontali o verticali, dall’alto verso il basso e da sinistra verso destra.
Nell’ esempio come si vede gli elementi sono
inseriti in verticale con:
android:orientation=”vertical”>.
Per l’orientamento orizzontale inserire :
android:orientation=”horizontal”>
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android“
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:gravity=”center”
android:orientation=”vertical”>
<Button
android:text=”Hello”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/activity_mainButton”/>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Hello, world!”
android:textAppearance=”?android:attr/textAppearanceMedium”/>
<EditText
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/activity_mainEditText”/>
</LinearLayout>
RelativeLayout
Questo layout è molto flessibile e viene utilizzato per personalizzare la vista che
può essere specificata come relativa agli elementi fratelli o rispetto al genitore:
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android“
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<EditText
android:id=”@+id/text”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”/>
<LinearLayout
android:id=”@+id/linearLayout”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_alignParentStart=”true”>
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Button1″
android:id=”@+id/button1″ />
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Button2″
android:id=”@+id/button2″ />
</LinearLayout>
</RelativeLayout>
Framelayout
FrameLayout è progettato per bloccare un’area sullo schermo per visualizzare un singolo elemento. Viene utilizzato per creare sovrapposizioni varie:
<FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:textSize=”80sp”
android:layout_gravity=”center_vertical”
android:text=”aaa” />
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center_vertical”
android:text=”bbb”
android:textSize=”50sp” />
</FrameLayout>
TableLayout
TableLayout posiziona i componenti in righe e colonne.Ecco uno schema progettato per la calcolatrice:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android“
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<TextView
android:id=”@+id/editText1″
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”10dp”
android:inputType=”numberDecimal”
android:textAlignment=”textEnd”/>
<TextView
android:id=”@+id/editText2″
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”10dp”
android:inputType=”numberDecimal”
android:textAlignment=”textEnd”/>
<TableRow
android:gravity=”center_horizontal”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”>
<Button
android:text=”C”
android:layout_width=”0dp”
android:id=”@+id/buttonCanc”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”0″
android:id=”@+id/buttonZero”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”ײ”
android:id=”@+id/buttonP3″
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”÷”
android:id=”@+id/buttonDiviso”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
</TableRow>
<TableRow
android:gravity=”center_horizontal”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”>
<Button
android:text=”7″
android:id=”@+id/buttonSette”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”8″
android:id=”@+id/buttonOtto”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”9″
android:id=”@+id/buttonNove”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”×”
android:id=”@+id/buttonPer”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
</TableRow>
<TableRow
android:gravity=”center_horizontal”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”>
<Button
android:text=”4″
android:id=”@+id/buttonQuattro”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”5″
android:id=”@+id/buttonCinque”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”6″
android:id=”@+id/buttonSei”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”-“
android:id=”@+id/buttonMeno”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
</TableRow>
<TableRow
android:gravity=”center_horizontal”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”>
<Button
android:text=”1″
android:id=”@+id/buttonUno”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”2″
android:id=”@+id/buttonDue”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”3″
android:id=”@+id/buttonTre”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”+”
android:id=”@+id/buttonPiu”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
</TableRow>
<TableRow
android:gravity=”center_horizontal”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_margin=”5dp”>
<Button
android:text=”.”
android:id=”@+id/buttonVirgola”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
<Button
android:text=”=”
android:id=”@+id/buttonUguale”
android:layout_width=”0dp”
android:layout_height=”wrap_content”
android:layout_margin=”3dp”
android:layout_gravity=”center_horizontal”
android:layout_weight=”1″/>
</TableRow>
</LinearLayout>
WebView
Una WebView è un estensione della View classe che permette di visualizzare pagine web e integrare un sito web nella propria applicazione. Il motore della WebView risiede nella libreria WebKit in grado di eseguire Javascript.
Il metodo loadUrl() fa sì che il motore del browser inizi il caricamento e
visualizza la pagina web all’indirizzo specificato.
Ecco il codice completo:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:gravity=”center”
android:orientation=”vertical”>
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Google.com”
android:id=”@+id/btn”/>
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”AppTutorial.link”
android:id=”@+id/btn2″/>
<WebView
android:id=”@+id/webView”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />
</LinearLayout>
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
MainActivity:
package com.webView.exsample.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.webView.exsample.R;
import android.widget.Button;
import android.view.View;
import android.widget.*;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
Button button,button2;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.btn);
button2=findViewById(R.id.btn2);
webView=findViewById(R.id.webView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(“http://www.google.com“);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(“http://www.apptutorialsystem.wordpress.com“);
}
});
}
}
Ricordiamoci di richiedere il permesso per accedere a Internet aggiungendo questa
riga di codice prima del tag <application>
su AndroidManifest:
<uses-permission android:name=”android.permission.INTERNET“/>
ProgressBar
La ProgressBar è un componente UI che indica
lo stato di avanzamento di un’operazione.
La barra di avanzamento supporta due modalità : indeterminato e determinato.
Si utilizza la modalità indeterminata per la barra di avanzamento quando non si sa quanto tempo richiederà l”operazione.
Si utilizza la modalità determinata per la barra di avanzamento quando si vuole mostrare una quantità specifica di avanzamento.
Per impostazione predefinita, una barra di avanzamento viene visualizzata come una ruota che gira.
Utilizzando il setProgress(int)metodo è possibile aggiornare la percentuale di avanzamento.La barra di avanzamento è piena quando il valore di avanzamento raggiunge 100.
<?xml version=”1.0″ encoding=”utf-8″?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”match_parent” android:layout_height=”match_parent” android:gravity=”center” android:orientation=”vertical”> <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Hello, world!” android:textAppearance=”?android:attr/textAppearanceMedium”/> <Button android:id=”@+id/btn” android:text=”Start” android:layout_width=”wrap_content” android:layout_height=”wrap_content”/>
<ProgressBar android:id=”@+id/mBar” android:layout_width=”match_parent” android:layout_height=”wrap_content” style=”?android:attr/progressBarStyleHorizontal”/></LinearLayout>
package com.exsample.progressBar.activities; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.exsample.progressBar.R; import android.view.*; import android.widget.*; import android.os.*; import android.app.*;
public class MainActivity extends AppCompatActivity { private ProgressBar progress; Thread thread; int mbar=0; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = findViewById(R.id.mBar); button = findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new Thread() {
public void run() {
for (mbar=0;mbar<100;mbar++){
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
progress.setProgress(mbar);
}
});
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
});
}
}

Wardell
gray
Plays
Bebop &
SWING
Wardell Gray was born in Oklahoma City, the youngest of four children. His early childhood years were spent in Oklahoma, before moving with his family to Detroit in 1929.
In early 1935, Gray began attending Northeastern High School, and then transferred to Cass Technical High School, which is noted for having Donald Byrd, Lucky Thompson and Al McKibbon as alumni.
AlertDialog in Android
Una finestra di dialogo è una piccola finestra che richiede all’utente di prendere una decisione e viene normalmente utilizzata per eseguire un’azione prima di poter procedere.AlertDialog è una finestra di dialogo che può mostrare un titolo, fino a tre pulsanti, o un elenco di elementi selezionabili sia con CheckBox o RadioButton.Ecco un esempio:
package com.exsample.alertDialog.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View.; import android.widget.;
import android.view.; import android.widget.Button; import com.exsample.alertDialog.R; import android.content.;
import androidx.appcompat.app.; import android.content.DialogInterface.;
public class MainActivity extends AppCompatActivity {
String option;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String[]options =
{“Data e ora”,”Accessibilita’”,”Account”};
AlertDialog.Builder builder=
new AlertDialog.Builder(MainActivity. this);
builder.setTitle(“Fai la tua scelta”);
builder.setSingleChoiceItems(options,2,new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
option=options[which];
if ( options[which]. equals ( options[ 0])) {
Intent intent= new Intent( android.provider.Settings.ACTION_DATE_SETTINGS);
startActivityForResult ( intent , 0);
}
if ( options[which] . equals (options[ 1])) {
Intent intent = new Intent (android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult ( intent , 1);
}
if ( options[which] . equals (options[ 2])) {
Intent intent = new Intent (android.provider.Settings.ACTION_ADD_ACCOUNT);
startActivityForResult ( intent , 2);
}
}
});
builder.setNegativeButton(“annulla”,new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
dismissDialog(which);
}
});
AlertDialog alert=builder.create();
alert.show();
}
}
Toast Android
Un Toast è una notifica mostrata per un particolare intervallo di tempo che scompare dopo qualche istante.
Le sue apparizioni improvvise ricordando il modo in cui il pane salta fuori dai tostapane.
La classe Toast utilizza due metodi statici:
public static Toast makeText(Context context, CharSequence text, int duration);
public static Toast makeText(Context context,int resId,int duration);
Per specificare la durata che può essere poco o tanto si utilizzano le costanti:
LENGTH_SHORT
LENGTH_LONG
Ecco un esempio utilizzando una CheckBox che non è altro che un elenco di scelte con cui l’utente può effettuare selezioni multiple:
Codice Java:
package com.exsample.chekBox.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.exsample.chekBox.R;
import android.view.*;
import android.widget.CompoundButton;
import android.widget.CheckBox;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
CheckBox check1, check2, check3, check4;
String text;
if(check1!=null){
@Override
public void onCheckedChanged(CompoundButton button, boolean checked) {
text= (checked ? “checked” : “unchecked”);
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onCheckedChanged(CompoundButton button, boolean checked) {
text=(checked ? “checked” : “unchecked”);
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
@Override
public void onCheckedChanged(CompoundButton button, boolean checked) {
text=(checked ? “checked” : “unchecked”);
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean checked) {
text=(checked ? “checked” : “unchecked”);
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
}
}
}
Context Menu Android
Context menu appaiono quando si mantiene il tocco per qualche istante sull’oggetto con cui si vuole interagire e consentono all’utente di selezionare più elementi per eseguire alcune azioni rapide all’interno di un’applicazione.
Andiamo a creare un file activity_main.xml:
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:id=”@+id/linearLayout”
android:gravity=”center”>
<TextView
android:text=”@string/hello_world”
android:id=”@+id/textView”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />
</LinearLayout>
Andiamo a definire un file XML all’interno della cartella res/menu( context):
<menu xmlns:android=”http://schemas.android.com/apk/res/android”>
<item
android:id=”@+id/MENU_1″
android:title=”Data e Ora”/>
<item
android:id=”@+id/MENU_2″
android:title=”Accessibilita’”/>
<item
android:id=”@+id/MENU_3″
android:title=”Account “/>
<item
android:id=”@+id/MENU_4″
android:title=”Connessione”/>
<item
android:id=”@+id/MENU_5″
android:title=”Apn “/>
<item
android:id=”@+id/MENU_6″
android:title=”Batteria “/>
<item
android:id=”@+id/MENU_7″
android:title=”Informazioni “/>
<item
android:id=”@+id/MENU_8″
android:title=”Cerca”/>
</menu>
Adesso andiamo a lavorare con il file MainActivity.java aggiungendo il codice per visualizzare ContextMenu. Ogni volta che l’app si avvia, facendo un lungo clic sul testo “Hello world!” viene visualizzato il menu con le opzioni che abbiamo inserito nel file context.XML:
package com.mycompany.myapp2;
import android.app.*;
import android.os.*;
import android.view.*;
import android.content.*;
import android.provider.*;
import android.widget.*;
import android.view.ContextMenu.*;
public class MainActivity extends Activity
{
TextView textView;
LinearLayout linearLayout;
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context, menu);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = findViewById(R.id.textView);
linearLayout = findViewById(R.id.linearLayout);
registerForContextMenu(textView);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
int id=item.getItemId();
switch(id)
{
case R.id.MENU_1:
if (item.getItemId()==R.id.MENU_1) {
startActivity(new Intent(Settings.ACTION_DATE_SETTINGS));
}
return true;
case R.id.MENU_2:
if (item.getItemId()==R.id.MENU_2) {
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
}
return true;
case R.id.MENU_3:
if (item.getItemId()==R.id.MENU_3) {
startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT));
}
return true;
case R.id.MENU_4:
if (item.getItemId()==R.id.MENU_4) {
startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));
}
return true;
case R.id.MENU_5:
if (item.getItemId()==R.id.MENU_5) {
startActivity(new Intent(Settings.ACTION_APN_SETTINGS));
}
return true;
case R.id.MENU_6:
if (item.getItemId()==R.id.MENU_6) {
startActivity(new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS));
}
return true;
case R.id.MENU_7:
if (item.getItemId()==R.id.MENU_7) {
startActivity(new Intent(Settings.ACTION_APPLICATION_SETTINGS));
}
return true;
case R.id.MENU_8:
if (item.getItemId()==R.id.MENU_8) {
startActivity(new Intent(Settings.ACTION_APP_SEARCH_SETTINGS));
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Come creare un App Torcia Android con Java
In questo tutorial andremo a progettare una semplice app Torcia utilizzando un ToggleButton per per accedere e spegnere e spegnere il flash dello smartphone:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android“
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:gravity=”center”
android:orientation=”vertical”>
<ToggleButton
android:layout_width=”90dp”
android:layout_height=”60dp”
android:id=”@+id/btn”
android:background=”#E5473D”
android:textSize=”40sp”/>
</LinearLayout>
Per attivare la torcia in Android, è necessario utilizzare la classe CameraManager.
Nel metodo onCreate() otteniamo l’ oggetto CameraManager . Quindi impostiamo OnClickListener() per il pulsante di accensione e il metodo CameraManager.setTorchMode() per attivare o disattivare la modalità torcia dell’unità flash:
package com.exsample.flashLight.activities;
import android.app.Activity;
import android.os.Bundle;
import com.exsample.contaPassi.R;
import android.widget.Button;
import android.widget.*;
import android.content.pm.*;
import android.hardware.camera2.*;
import android.content.*;
public class MainActivity extends Activity {
CameraManager cameraManager;
String cameraId;
boolean flashAvailable;
ToggleButton btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.btn);
flashAvailable = getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraId = cameraManager.getCameraIdList()[0];
} catch (CameraAccessException e) {
e.printStackTrace();
}
btn= findViewById(R.id.btn);
btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switchFlashLight(isChecked);
}
});
}
public void switchFlashLight(boolean status) {
try {
cameraManager.setTorchMode(cameraId, status);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}