0

Ich möchte & speichern Schaltfläche Text onLongClick dauerhaft speichern (bis &, es sei denn, ich ändere es erneut). This ist ein Screenshot des gesamten Codes. Aber wenn ich die App & wieder öffne, bleibt der Button-Text Standard. Welchen Fehler mache ich?Ändern und Speichern Button Text onLongClick using sharedpreferences

package com.demo.buttontextedit; 

import android.content.Context; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    SharedPreferences sharedPreferences; 
    private Button btn; 
    private EditText edit; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button) findViewById(R.id.button); 
     edit = (EditText) findViewById(R.id.edit_text); 
     btn.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       showDialog(edit.getText().toString()); 
       return true; 
      } 
     }); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getApplicationContext(), "You clicked Button" + 
         btn.getText().toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    private void showDialog(String str) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("input text"); 
     View view = LayoutInflater.from(this).inflate(R.layout.dialog_view, null); 
     final EditText edit_dialog = (EditText) view.findViewById(R.id.edit_dialog); 
     edit_dialog.setText(str); 
     builder.setView(view); 

     builder.setNegativeButton("cancel", null); 
     builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       sharedPreferences = getSharedPreferences("myPref", Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putString("Name", edit_dialog.getText().toString()); 
       editor.commit(); 
       btn.setText(sharedPreferences.getString("Name", "")); 
      } 
     }); 
     builder.show(); 
    } 
} 
+0

Sie müssen Ihren Schaltflächentext von 'onCreate()' entsprechend dem Wert in sharedpreference aktualisieren. – Rashin

Antwort

3

Ihnen fehlt Text von gemeinsamen Voreinstellungen für Oncrete-Aktivität. Lösung

setzen diese Zeilen: if (sharedPreferences.getString ("Name", "") .equals ("")) {

btn.setText("YES"); 

} else {

btn.setText(sharedPreferences.getString("Name", "YES")); 

}

unter dieser Zeile: btn = (Schaltfläche) findViewById (R.id.button);

0

Das Hauptproblem, wie ich sehen kann, ist, dass diese Linie:

btn.setText(sharedPreferences.getString("Name", "YES")); 

aufgerufen wird, bevor die Taste initialisiert und in der Ansicht gefunden. Dies führt dazu, dass die Zeichenfolge auf einen Nullzeiger gesetzt wird, der die App abstürzt (falls nicht versucht wird). Solange Sie die Schaltfläche definieren, bevor Sie den Text festlegen, wird kein Nullzeiger und Text festgelegt.

btn = (Button) findViewById(R.id.button); 
btn.setText(sharedPreferences.getString("Name", "YES")); 
1

Ablauf der Steuerung, die dieses Verhalten verursacht.

Sie müssen in oncreate Daten aus Vorzug holen und stellte sie auf die button wie

oncreate(Bundle b) { 
// initialize preference and layout 
String btntext=sharedPreferences.getString("btnkey","Yes") 
btn.setText(btntext); 
} 

so, wenn die Anwendung neu erstellt wird, können Sie die gespeicherten text von preference finden und es auf den Button gesetzt und es ist fertig.