2016-11-13 3 views
1

Ich verwende einen Floating-Action-Button und sein Bild ändert sich, wenn darauf geklickt wird. Ich habe eine Flagge und ich speichere es in geteilten Präferenzen. Wenn es wahr ist, wird das Symbol like.png, wenn es falsch ist, wird icon dislike.png.Floating Action Button-Hintergrund ändern

ich das entsprechende Symbol wollen nach Flagvariable ändern, aber wenn die App auf das Symbol startet standardmäßig welches true.png

Wie kann ich das Symbol über gemeinsame Einstellungen festgelegt?

public class ReadActivity extends AppCompatActivity { 

private FloatingActionButton fab; 
private boolean flag; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read); 

    fab = (FloatingActionButton) findViewById(R.id.fab); 

    getRate(getWindow().getDecorView().getRootView()); 

    if(flag==false){ 
     fab.setImageResource(R.drawable.like); 
    } 

    else if(flag==true){ 
     fab.setImageResource(R.drawable.dislike); 
    } 

    fab.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      getRate(v); 

      if(flag==false) { 
       rateUp(); 
       Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show(); 
       saveRate(v, true); 
       fab.setImageResource(R.drawable.dislike); 
      } 

      else if(flag==true){ 
       rateDown(); 
       Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show(); 
       saveRate(v, false); 
       fab.setImageResource(R.drawable.like); 

      } 
     } 
    }); 


} 

public void rateUp() {}; 
public void rateDown() {}; 



public void saveRate(View view, boolean flag){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean(id, flag); 
    editor.commit(); 
} 

public void getRate(View view){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 

    flag = sharedPreferences.getBoolean(id, false); 

} 


} 

Antwort

0

diesen Code Versuchen:

public class ReadActivity extends AppCompatActivity { 

private FloatingActionButton fab; 
private string getSharedPreferencesId="getSharedPreferencesId"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read); 

    fab = (FloatingActionButton) findViewById(R.id.fab); 

    boolean flag=getRate(); 

    if(flag==false){ 
     fab.setImageResource(R.drawable.like); 
    } 

    else if(flag==true){ 
     fab.setImageResource(R.drawable.dislike); 
    } 

    fab.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      boolean flag=getRate(); 

      if(flag==false) { 
       rateUp(); 
       Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show(); 
       saveRate(true); 
       fab.setImageResource(R.drawable.dislike); 
      } 

      else if(flag==true){ 
       rateDown(); 
       Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show(); 
       saveRate(false); 
       fab.setImageResource(R.drawable.like); 

      } 
     } 
    }); 


} 

public void rateUp() {}; 
public void rateDown() {}; 



public void saveRate(boolean flag){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean(getSharedPreferencesId, flag); 
    editor.commit(); 
} 

public boolean getRate(){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 
    flag = sharedPreferences.getBoolean(getSharedPreferencesId, false); 
} 


} 
+0

Aber ich will die Änderung auf das Symbol, wenn app – Burak

+0

starten Sie den Code in ReadActivity fab.setBackgroundTintList verwenden (ColorStateList.valueOf (Farb .parseColor ("# 33691E"))); –

+0

Ich frage eine komplett andere Frage – Burak

0

Ich habe einige Verbesserungen auf Ihren Code:

public class ReadActivity extends AppCompatActivity { 

private FloatingActionButton fab; 
private boolean flag; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read); 

    fab = (FloatingActionButton) findViewById(R.id.fab); 

    flag = getRate(); 

    if(flag) 
     fab.setImageResource(R.drawable.dislike); 
    else 
     fab.setImageResource(R.drawable.like); 

    fab.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      flag = getRate(); 

      if(flag) { 
       rateDown(); 
       Snackbar.make(v, "Vote -1", Snackbar.LENGTH_LONG).show(); 
       saveRate(false); 
       fab.setImageResource(R.drawable.like); 
      } 
      else{ 
       rateUp(); 
       Snackbar.make(v, "Vote +1", Snackbar.LENGTH_LONG).show(); 
       saveRate(true); 
       fab.setImageResource(R.drawable.dislike); 
      } 
     } 
    }); 


} 

public void rateUp() {}; 
public void rateDown() {}; 



public void saveRate(boolean flag){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean(id, flag); 
    editor.commit(); 
} 

public boolean getRate(){ 
    SharedPreferences sharedPreferences = getSharedPreferences("Rates", MODE_PRIVATE); 

    boolean flag = sharedPreferences.getBoolean(id, false); 
    return flag; 
} 


} 

Auch Ihre activity_read.xml Datei überprüfen. Wenn Sie ein Bild auf Ihrem XML-FloatingActionButton festgelegt haben, wird dieses Bild immer als Standard verwendet.

+0

nichts geändert, immer noch gleich.'getRate()' gibt seinen Standardwert zurück, der falsch ist, wenn ich die Aktivität starte. Aber das Symbol ändert sich, wenn ich 'onClick()' ' – Burak

0

Ich werde Ihnen die Logik sagen. Angenommen, Sie haben viele verschiedene Inhalte und möchten für jeden Inhalt Bewertungsdaten speichern.

Zuerst müssen Sie in Ihren jeweiligen Inhalt der Bewertung Daten speichern, irgendwo (lokale oder Remote-DB, SharedPreferences, Datei etc.)

nach dem ReadActivity Start

  1. Legen Sie Ihre Flagge auf Standardwert du wolltest sein.
  2. Legen Sie Ihr FAB-Symbol als Standard fest.
  3. Erhalten Sie Ihre verwandten Inhaltseinstufungsdaten (boolean) von wo Sie zuvor gespeichert haben.
  4. Überprüfen Sie, ob Ihre Bewertungsdaten wahr oder falsch sind.
  5. Wenn es stimmt Satz Ihr Symbol R.drawable.dislike, sonst R.drawable.like gesetzt
  6. Wenn Sie die FAB geklickt haben, ändern Sie Ihre Flag-Wert und FAB-Symbol
  7. zu Ihrem neuen boolean Wert speichern, wo Sie gespeichert vor

Der wichtige Punkt ist, müssen Sie unterschiedliche Werte für jeden Inhalt, den Sie haben.

EDIT:

Versuchen Sie es mit getApplicationContext() vor getSharedPreferences() verwendet Sie können auch versuchen editor.apply() anstelle von editor.commit();

commit() und apply() hat die gleiche Arbeit, aber es gibt zwei Unterschiede, apply() arbeitet asynchron und commit() gibt Booleschen Wert.

public void saveRate(View view, boolean flag){ 
    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Rates", MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean(id, flag); 
    editor.apply(); 
} 

public void getRate(View view){ 
    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Rates", MODE_PRIVATE); 

    flag = sharedPreferences.getBoolean(id, false); 

} 
+0

Ich dachte und tat das gleiche wie Sie erwähnt und FAB-Symbol ändert sich, wenn ich darauf klicke, gibt es kein Problem. Wenn ich 'getRate() 'beim Start der Aktivität aufrufe, wird automatisch der Standardwert von sharedPreference zurückgegeben. – Burak

+0

funktioniert auch nicht. Danke für die Hilfe, ich werde einen anderen Trick versuchen. – Burak