Использование общих настроек для запоминания размера шрифта, который пользователь предпочитает в Android.

Я разрабатываю мобильное приложение для Android. Я включил увеличение или уменьшение текста. Я хочу, чтобы приложение могло запоминать конкретный размер шрифта, который предпочитает пользователь, когда пользователь закрывает определенную песню на другую или даже лучше, даже когда пользователь закрывает приложение и снова открывает его. Вот как я пытался это сделать:

public void saveFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putFloat("fontsize",factor.getInt());
    editor.apply();
}

public void rememberFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    double factor = sharedPref.getString("fontsize","");
    factor.setInt();
}

Вот весь класс:

public class SongbookActivity extends AppCompatActivity {
private TextView wordMeaning;
private TextToSpeech convertToSpeech;
ScaleGestureDetector scaleGestureDetector;
public double factor;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dictionary);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbarSongActivity);
    TextView textViewTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
    setSupportActionBar(toolbar);


    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    int dictionaryId = bundle.getInt("SONG._ID");
    int id = dictionaryId + 1;


    wordMeaning = (TextView)findViewById(R.id.dictionary);


    String title = bundle.getString("SONG._TITLE");
    String description = bundle.getString("SONG._LYRICS");

    final android.support.v7.app.ActionBar ab = getSupportActionBar();
    ab.setHomeAsUpIndicator(R.drawable.left);
    ab.setTitle(null);
    ab.setDisplayHomeAsUpEnabled(true);


    textViewTitle.setText(title);

    textViewTitle.setSelected(true);
   // textViewTitle.setMovementMethod(new ScrollingMovementMethod());

    wordMeaning.setTextIsSelectable(true);

    registerForContextMenu(wordMeaning);
    wordMeaning.setMovementMethod(new ScrollingMovementMethod());
    wordMeaning.setText(description);
    scaleGestureDetector = new ScaleGestureDetector(this, new simpleOnScaleGestureListener());


    }


//copy text or select
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    //user has long pressed your TextView
    menu.add(0, v.getId(), 0, "Song copied to Clipboard");

    //cast the received View to TextView so that you can get its text
    TextView yourTextView = (TextView) v;

    //place your TextView's text in clipboard
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    clipboard.setText(yourTextView.getText());

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {


    if (event.getPointerCount() > 1) {
        scaleGestureDetector.onTouchEvent(event);
        return true;
    }
    return false;


}

public void saveFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putFloat("fontsize",factor.getInt());
    editor.apply();
}

public void rememberFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    double factor = sharedPref.getString("fontsize","");
    factor.setInt();
}

public class simpleOnScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        // TODO Auto-generated method stub
        float size = wordMeaning.getTextSize();
        Log.d("TextSizeStart", String.valueOf(size));

        float factor = detector.getScaleFactor();
        Log.d("Factor", String.valueOf(factor));

        float product = size*factor;
        Log.d("TextSize", String.valueOf(product));
        wordMeaning.setTextSize(TypedValue.COMPLEX_UNIT_PX, product);

        size = wordMeaning.getTextSize();
        Log.d("TextSizeEnd", String.valueOf(size));
        return true;
    }
}



@Override
public boolean onOptionsItemSelected(MenuItem item) {
    double factor = 1;
    float size = wordMeaning.getTextSize();
    saveFont(View view);
    rememberFont(View view);
    Log.d("TextSizeStart", String.valueOf(size));
    switch (item.getItemId()) {
        case R.id.small_layout:
            factor = 0.5;
            break;
        case R.id.medium_layout:
            factor = 0.9;
            break;
        case R.id.large_layout:
            factor = 1.3;
            break;
        case R.id.xlarge_layout:
            factor = 1.8;
            break;
    }



    Log.d("Factor", String.valueOf(factor));

    double product = size*factor;
    Log.d("TextSize", String.valueOf(product));
    wordMeaning.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float)product);

    size = wordMeaning.getTextSize();
    Log.d("TextSizeEnd", String.valueOf(size));
    return super.onOptionsItemSelected(item);



}

}

Я получаю ошибки при попытке вызвать метод и при объявлении метода. я новичок в этом, поэтому, пожалуйста, дайте мне все детали, которые, по вашему мнению, могут мне помочь, независимо от того, насколько незначительными они могут быть.


person Vincent H Guyo    schedule 01.10.2015    source источник


Ответы (3)


здесь вы получите все http://developer.android.com/training/basics/data-storage/shared-preferences.html на самом деле вы сохраняете в float с int и пытаетесь получить строку, поэтому попробуйте ниже

public void saveFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("fontsize",factor.getInt());
    editor.commit();
}

и от возвращения

public void rememberFont(View view){
    SharedPreferences sharedPref = getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    int  prevFont = sharedPref.getInt("fontsize",-1);

}

в -1 вы можете установить свой шрифт по умолчанию

person Pavan    schedule 01.10.2015
comment
Я добавил метод следующим образом, но ничего не произошло: public void setVariable(float myFloat) { SharedPreferences pref =getSharedPreferences(fontsize, Context.MODE_PRIVATE); Редактор SharedPreferences.Editor = pref.edit(); editor.putFloat (размер шрифта, myFloat); редактор.коммит(); } public float getVariable() { SharedPreferences pref = getSharedPreferences (размер шрифта, Context.MODE_PRIVATE); return pref.getFloat(fontsize, 1/*значение по умолчанию*/); } - person Vincent H Guyo; 02.10.2015

Если у вас возникли проблемы с SharedPreferences, попробуйте использовать это. Это значительно упрощает весь процесс и использует внутренние настройки SharedPreferences. Все, что вам нужно сделать, это скопировать исходный файл в свой проект и использовать его.

Вот пример:

В методе onCreate() вашей активности инициализируйте TinyDB.

TinyDB tinyDB = new TinyDB(this);

Затем используйте его следующим образом:

tinyDB.putString("fontSize", "12");

String fontSize = tinyDB.getString("fontSize");

Так просто, как, что. Есть много методов, которые очень полезны в повседневной разработке, просто просмотрите исходный файл один раз. Надеюсь, поможет.

person Amit Tiwari    schedule 01.10.2015

Просто "свет", как вы можете это сделать.

public void setVariable(float myFloat) {
    pref = _context.getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    editor = pref.edit();
    editor.putFloat("fontsize", myFloat);
    editor.commit();
}

public float getVariable() {
    pref = _context.getSharedPreferences("fontsize", Context.MODE_PRIVATE);
    return pref.getFloat("fontsize", 5.5/*a default value*/);
}

_context может быть атрибутом.

EDIT1: этот класс отлично работает для меня при любых проблемах с сохранением. Измените это как вам нужно

public class SharedPreferencesManager {

    // Shared Preferences
    private SharedPreferences pref;
    private SharedPreferences.Editor editor;
    private Context _context;

    // Shared pref mode
    private final int PRIVATE_MODE_SHARED_PREF = 0;

    // Shared preferences file name
    private final String PREF_NAME = "blabla";

    /*KEYS para o sharedpreferences*/
    private final String KEY_TO_USE = PREF_NAME + "setFont";


    public SharedPreferencesManager(Context context) {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE_SHARED_PREF);
        editor = pref.edit();
    }

    public void setFont(float keySize) {
        editor.putFloat(KEY_TO_USE, keySize);
        editor.commit();
    }

        public boolean getFont() {
        return pref.getFloat(KEY_TO_USE, 15/*your default value is in here (in sp)*/);
    }
}

Чтобы использовать это, просто создайте объект (передав контекст [действие]) и используйте метод GET в КАЖДОМ вызове/раздувании вашего EditText/TextView и установите размер следующим образом.

myTextView.setTextSize(mSharedPreferencesManagerObject.getVariable())

И чтобы все это имело смысл, при КАЖДОМ изменении масштаба вам нужно звонить

mSharedPreference.setVariable(sizeHere)

ДОЛЖЕН работать. Если нет, проблема в вашей логике/семантике «OnZoomChange».

person TroniPM    schedule 01.10.2015
comment
Я добавляю метод следующим образом: public void setVariable(float myFloat) { SharedPreferences pref =getSharedPreferences(fontsize, Context.MODE_PRIVATE); Редактор SharedPreferences.Editor = pref.edit(); editor.putFloat (размер шрифта, myFloat); редактор.коммит(); } public float getVariable() { SharedPreferences pref = getSharedPreferences (размер шрифта, Context.MODE_PRIVATE); return pref.getFloat(fontsize, 1/*значение по умолчанию*/); }. Я использую шрифт по умолчанию как 1, потому что это коэффициент умножения, который я хочу использовать для своего шрифта по умолчанию\ - person Vincent H Guyo; 02.10.2015
comment
Что вы имеете в виду под изменением размера шрифта? - person TroniPM; 05.10.2015
comment
Я разрабатываю мобильное приложение для Android. Я включил увеличение или уменьшение текста. Я хочу, чтобы приложение могло запоминать конкретный размер шрифта, который предпочитает пользователь, когда пользователь закрывает определенную песню на другую или даже лучше, даже когда пользователь закрывает приложение и снова открывает его, но мне нужно изменить размер шрифта на шрифт размер, который я бы установил перед закрытием песни. например Если я открываю песню под названием «Разбить каждую цепочку», я устанавливаю для шрифта значение «Очень большой», если я снова возвращаюсь к той же песне или к другой, она устанавливает для шрифта значение по умолчанию, а не «Очень большой». - person Vincent H Guyo; 05.10.2015