2016-05-12 2 views
1

Ich habe Probleme, mein Layout in Echtzeit auf meiner Anwendung zu aktualisieren.ANDROID: Änderung meines Layouts in Echtzeit

Ich möchte einen ersten Bildschirm mit einer Schaltfläche "Daten laden" zeigen. Wenn ich die Taste drücke, möchte ich den Text in "Loading ..." ändern und eine Fortschrittsanzeige erscheinen lassen, während die App die Daten lädt. Wenn es fertig ist, möchte ich den Text wieder in "App starten" ändern und den Fortschrittsbalken deaktivieren.

Das Problem, das ich habe ist, dass der Text in der Schaltfläche nicht funktioniert refrech und die Progressiv-Bar wird nicht angezeigt ...

ich viele Dinge ausprobiert habe, mit und ohne Gewinde, auf der Suche nach Hilfe im Internet, aber ich konnte keinen passenden Tipp finden.

Vielleicht hast du eine Idee, mir zu helfen? : D

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    button=(Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 
    button.setText("Load Data"); 
    findViewById(R.id.progressBar).setVisibility(View.INVISIBLE); 
} 

private void appInit() { 
      try { 
       ((MyApp) getApplication()).getDataFromServer(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      ((MyApp) getApplication()).initData(); 

} 


@Override 
public void onClick(final View v) { 
    Button b = (Button)v; 
    String buttonText = b.getText().toString(); 
    if(buttonText=="Load Data"){ 
     findViewById(R.id.progressBar).setVisibility(View.VISIBLE); 
     button.setText("Loading"); 
     appInit(); 
     while(!((MyApp)this.getApplication()).isInitSucceded()){} 
     button.setText("Launch App"); 
     findViewById(R.id.progressBar).setVisibility(View.INVISIBLE); 
     findViewById(R.id.button).setVisibility(View.VISIBLE); 
    } 
    else { 
     Intent intent = new Intent(MainActivity.this, ddcorp.test.Resume.class); 
     startActivity(intent); 
    } 
} 
+1

Sie benötigen, um zu erfahren [AsyncTasks] (http://developer.android.com/reference/android/os/AsyncTask.html) - Sie dienen dazu, Ihnen beim Ausführen von Hintergrundaufgaben (wie der appInit-Methode) zu helfen und die Benutzeroberfläche auf einfache Weise zu aktualisieren. – adelphus

+0

Sie können das mit Hilfe von AsyncTask tun - siehe zum Beispiel http://StackOverflow.com/questions/16275913/show-progress-dialog-while-loading-data – hilzj

+0

2016 und immer noch mit AsyncTask ist traurig. Gehen Sie für RxAndroid, es ist ein bisschen schwierig zu starten, aber nachdem es einfach ist und viel viel mächtiger als AsyncTask. – Leonardo

Antwort

0

mit der folgenden Zeile ein UI-Thread Blocking ist keine gute Idee:

while(!((MyApp)this.getApplication()).isInitSucceded()){} 

alternativ können Sie AsyncTask verwenden, die Methoden für Hintergrund hat Prozess-, Fortschritts-Update- und Post-Ausführungslogik. Hier ein Beispiel:

public class MyTask extends AsyncTask<Void,Integer,String> 
{ 
    @override 
    public String doInBackground(Void... params) 
    { 
     //do your background processes 
     ... 
     publishProgress(someInteger); //for updating progress bar 
     ... 
     return result; 
    } 

    @override 
    public void onProgressUpdate(Integer... params) 
    { 
     //do your progress bar update with params[0] 
    } 

    @override 
    public void onPostExecute(String.. params) 
    { 
     //do something with the results of doInBackground stored in params[0] 
    } 
} 

und hier ist, wie man es nennen:

(new MyTask()).execute(); 
+0

Vielen Dank für den Tipp! Es funktioniert super! –

0

Try this:

if(buttontext.equals("Load Data")){ 
    .. 
} 
+0

Entschuldigung, ich habe vergessen zu sagen, wo mein Problem war. Tatsächlich wird der Text nicht aktualisiert und der progressive Balken wird nicht angezeigt:/Mein Code ist korrekt, aber ich weiß nicht warum, die Operationen auf dem Layout sind nicht effektiv –

0

Hier ist meine Lösung, wenn es jemand eines Tages helfen kann: D

Button button; 
ProgressBar progress; 
private Context mContext; 
MyApp mApplication; 
public Init(Context context){ 
    mContext = context; 
    mApplication = (MyApp) mContext.getApplicationContext(); 
} 


@Override 
protected void onPreExecute() { 
    ProgressBar progress=(ProgressBar)((Activity)mContext).findViewById(R.id.progressBar); 
    progress.setVisibility(View.VISIBLE); 
    button=(Button)((Activity)mContext).findViewById(R.id.button); 
    button.setText("Loading"); 
    button.setBackgroundColor(mContext.getResources().getColor(R.color.lgreen)); 
} 

@Override 
public Void doInBackground(Void... params) { 

    try { 
     mApplication.getDataFromServer(); 
     mApplication.initData(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 


protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
    ProgressBar progress=(ProgressBar)((Activity)mContext).findViewById(R.id.progressBar); 
    progress.setVisibility(View.INVISIBLE); 
    button=(Button)((Activity)mContext).findViewById(R.id.button); 
    button.setText("Launch"); 
    button.setBackgroundColor(mContext.getResources().getColor(R.color.green)); 
    System.out.println("ok"); 
}