I wanted to implement a transition between two Activitys, where the user would see a Progress Bar (already implemented) and a textview where every 2 seconds, a new phrase appears to me, for example:
- Loading information ...
- Implementing the two definitions ...
- Finishing the registry ...
I've seen some solutions, but they did not explain the exact way we should update the TextView, so I already have the following code:
updatingThread = new Thread() {
@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
//o meu problema em entender está a partir daqui, qual a forma mais correta de implementar o uptadate da textview?
textviewtoWait.setText(R.string.loadInfo);
textviewtoWait.setText(R.string.loadInfo2);
textviewtoWait.setText(R.string.loadInfo3);
}
});
updatingThread.start();
}
Before using Thread, I had a transition with a single TextView with a single string and a Progress Bar with the following code ( in this TextView is in XML )
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent myIntent = new Intent(actualContext, MainActivityProto.class);
myIntent.putExtra("email", novoUtilizador.getEmail_utilizador());
myIntent.putExtra("nome", novoUtilizador.getNome());
startActivity(myIntent); // termina com a actividade anterior, o que impede o utilizador de voltar atras.
finish();
}
}, 5000);
EDIT
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button txttoRegister, txttoLogin;
private EditText editTextUser, editTextPassword, addUser, addEmail, addLocal, addPassword, addTelm;
private TextView textviewtoTitle, txtviewtoMainPage, txtviewtoSecondMain, textviewtoWait;
private SharedPreferences sharedpreferences;
private Toolbar toolmenubar;
// private Thread updatingThread;
final Thread updatingThread = new Thread() {
@Override
public void run() {
try {
// Array com os valores que serão exibidos no textviewtoWait
final int[] txts = {R.string.loadInfo, R.string.loadInfo2, R.string.loadInfo3 };
while (!isInterrupted()) {
// Vamos iterar a lista para atualizar o textviewtoWait
for(final int txt : txts){
// aguarda 2 segundo...
Thread.sleep(2000);
// Runnable responsavel por atualizar a tela...
final Runnable updateUI = new Runnable() {
@Override
public void run() {
textviewtoWait.setText(txt);
}
};
runOnUiThread(updateUI);
}
// este irá sair do while, pois já realizamos as ações!
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txttoRegister = (Button) findViewById(R.id.buttontoRegister);
txttoLogin = (Button) findViewById(R.id.buttontoLogin);
textviewtoWait = (TextView) findViewById(R.id.txtviewtoWait);
changeTextFontFamily();
txttoRegister.setOnClickListener(this);
txttoLogin.setOnClickListener(this);
Typeface face = Typeface.createFromAsset(getAssets(), "Carnevalee Freakshow.ttf");
sharedpreferences = getApplicationContext().getSharedPreferences("Preferences", 0);
String login = sharedpreferences.getString("LOGIN", null);
if (login != null) {
MyDBHelper dbHelper = new MyDBHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM Utilizador WHERE email_utilizador = '" + login + "'", null);
if (cursor != null && cursor.moveToFirst()) {
Intent myIntent = new Intent(this, MainActivityProto.class);
myIntent.putExtra("nome", cursor.getString(1));
myIntent.putExtra("email", cursor.getString(0));
startActivity(myIntent);
}
}
}
/**
* Algoritmo e metodo para fazer ligação aos cliques dos botões eixstentes na aplicação.
*
* @param v
*/
@Override
public void onClick(View v) {
if (v.getId() == R.id.buttontoRegister) {
alertDialogtoRegist();
}
if (v.getId() == R.id.buttontoLogin) {
final Context actualContext = this;
String userName = editTextUser.getText().toString();
String passWord = editTextPassword.getText().toString();
MyDBHelper dbHelper = new MyDBHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
if (!userName.matches("") && !passWord.matches("")) {
Cursor cursor = db.rawQuery("SELECT * FROM Utilizador WHERE email_utilizador = '" + userName + "'", null);
if (cursor != null && cursor.moveToFirst()) {
String pass_utilizador = cursor.getString(2);
/*Verifica a igualdade das passwords*/
if (pass_utilizador.equals(passWord)) {
final Utilizador novoUtilizador = criarUtilizador(cursor);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("LOGIN", novoUtilizador.getEmail_utilizador());
editor.commit();
setContentView(R.layout.transition_to_mainpage);
Intent myIntent = new Intent(actualContext, MainActivityProto.class);
myIntent.putExtra("email", novoUtilizador.getEmail_utilizador());
myIntent.putExtra("nome", novoUtilizador.getNome());
startActivity(myIntent); // termina com a actividade anterior, o que impede o utilizador de voltar atras.
finish();
} else {
apresenta_toast("A password que introduziu está errada!");
}
} else {
apresenta_toast("Utilizador inexistente na plataforma!");
}
} else {
apresenta_toast("Não é possível fazer login, senão introduzir nenhum dado!");
}
}
}
/**
* Método para colocar todos os botões e edittexts com o mesmo tipo de letra
*/
private void changeTextFontFamily() {
txttoRegister = (Button) findViewById(R.id.buttontoRegister);
editTextUser = (EditText) findViewById(R.id.ET_username);
editTextPassword = (EditText) findViewById(R.id.ET_password);
Typeface face = Typeface.createFromAsset(getAssets(), "Carnevalee Freakshow.ttf");
txttoLogin.setTypeface(face);
txttoRegister.setTypeface(face);
editTextUser.setTypeface(face);
editTextPassword.setTypeface(face);
}
/**
* Algoritmo para a criação de uma AlertDialog para permitir o registo de novo utilizador
* na plataforma.
*/
private void alertDialogtoRegist() {
final Context actualContext = this;
AlertDialog.Builder dialogtoRegist = new AlertDialog.Builder(this);
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
final View myView = inflater.inflate(R.layout.registerdialog, null);
textviewtoTitle = (TextView) myView.findViewById(R.id.txttoTitleRegisto);
addUser = (EditText) myView.findViewById(R.id.edittoAddUser);
addEmail = (EditText) myView.findViewById(R.id.edittoAddEmail);
addLocal = (EditText) myView.findViewById(R.id.edittoAddLocal);
addPassword = (EditText) myView.findViewById(R.id.edittoAddPass);
addTelm = (EditText) myView.findViewById(R.id.edittoTelm);
txtviewtoMainPage = (TextView) myView.findViewById(R.id.txttoTitleRegisto);
Typeface face = Typeface.createFromAsset(getAssets(), "Carnevalee Freakshow.ttf");
textviewtoTitle.setTypeface(face);
addUser.setTypeface(face);
addEmail.setTypeface(face);
addLocal.setTypeface(face);
addPassword.setTypeface(face);
addTelm.setTypeface(face);
dialogtoRegist.setView(myView);
dialogtoRegist.setPositiveButton(R.string.registobutton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDBHelper dbHelper = new MyDBHelper(actualContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
db.execSQL("INSERT INTO Utilizador(email_utilizador, nome, password, localizacao) VALUES ('" + addEmail.getText().toString() + "', '" + addUser.getText().toString() + "', '" + addPassword.getText().toString() + "', '" + addLocal.getText() + "')");
apresenta_toast("Utilizador criado com sucesso!");
} catch (Exception e) {
apresenta_toast("O utilizador que pretende criar já existe! Tente Novamente!");
}
}
});
dialogtoRegist.setNeutralButton("Cancelar", null);
AlertDialog alertDialog = dialogtoRegist.create();
alertDialog.show();
}
@Override
protected void onStart() {
super.onStart();
updatingThread.start();
}
/**
* Algoritmo para a criação de um novo utilizador na plataforma.
*
* @param cursor_utilizadores
* @return
*/
private Utilizador criarUtilizador(Cursor cursor_utilizadores) {
Utilizador newUtilizador = new Utilizador();
newUtilizador.setEmail_utilizador(cursor_utilizadores.getString(0));
newUtilizador.setNome(cursor_utilizadores.getString(1));
newUtilizador.setPassword(cursor_utilizadores.getString(2));
newUtilizador.setLocalizacao(cursor_utilizadores.getString(3));
return newUtilizador;
}
/**
* Algoritmo de impressão de toasts basicamente de impressão
*
* @param mensagem
*/
private void apresenta_toast(String mensagem) {
Toast toast = Toast.makeText(this, mensagem, Toast.LENGTH_SHORT);
toast.show();
}
}
Error when code setText()
is not commented out:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText (int)' on a null object reference
When commented, it shows the transition layout for not even 1 second:
setContentView(R.layout.transition_to_mainpage);
And then you'll soon enter Intent, which will re-direct you to the next Activity.
I wanted it to show the R.layout.transition ... with this TextView update.
SOLUTION
private void mainThread() {
final Thread updatingThread = new Thread() {
@Override
public void run() {
try {
// Array com os valores que serão exibidos no textviewtoWait
final int[] txts = {R.string.loadInfo, R.string.loadInfo2, R.string.loadInfo3};
while (!isInterrupted()) {
// Vamos iterar a lista para atualizar o textviewtoWait
for (final int txt : txts) {
// aguarda 2 segundo...
Thread.sleep(2000);
// Runnable responsavel por atualizar a tela...
final Runnable updateUI = new Runnable() {
@Override
public void run() {
textviewtoWait.setText(txt);
// TextView.class.cast(getLayoutInflater().inflate(R.layout.transition_to_mainpage, null).findViewById(R.id.txtviewtoWait)).setText(txt);
}
};
runOnUiThread(updateUI);
}
// este irá sair do while, pois já realizamos as ações!
break;
}
irParaProximaActivity();
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
};
updatingThread.start();
}
private void irParaProximaActivity() {
actualContext = getApplicationContext();
Intent myIntent = new Intent(actualContext, MainActivityProto.class);
myIntent.putExtra("email", novoUtilizador.getEmail_utilizador());
myIntent.putExtra("nome", novoUtilizador.getNome());
startActivity(myIntent); // termina com a actividade anterior, o que impede o utilizador de voltar atras.
finish();
}
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
final View myView = inflater.inflate(R.layout.transition_to_mainpage, null);
textviewtoWait = (TextView) myView.findViewById(R.id.txtviewtoWait);
setContentView(myView);
mainThread();