【问题标题】:How to implement SharedPreferences?如何实现 SharedPreferences?
【发布时间】:2013-09-15 09:15:06
【问题描述】:

我应该如何在GameScreen 中的updateRunning(List<TouchEvent> touchEvents, float deltaTime) 中实现SharedPreferences?

SharedPreferences settings = getSharedPreferences("Prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("highscore", var);
editor.commit();

GameScreen.java

package com.m.robotgame;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import android.app.Activity;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Paint;

import com.m.framework.Game;
import com.m.framework.Graphics;
import com.m.framework.Image;
import com.m.framework.Input.TouchEvent;
import com.m.framework.Screen;

public class GameScreen extends Screen {

    enum GameState {
        Ready, Running, Paused, GameOver
    }

    GameState state = GameState.Ready;

    private static Robot robot;

    public static int height = 0, highscore;
    public int score;

    private Image currentSprite, character;

    private ArrayList<Tile> tilearray = new ArrayList<Tile>();

    Paint paint;

    public GameScreen(Game game) {
        super(game);
        robot = new Robot();
        character = Assets.character;
        paint = new Paint();
        paint.setTextSize(25);
        paint.setTextAlign(Paint.Align.CENTER);
        paint.setAntiAlias(true);
        paint.setColor(Color.WHITE);

    }

    @Override
    public void update(float deltaTime) {
        List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
        if (state == GameState.Ready)
            updateReady(touchEvents);

        if (state == GameState.Running)
            updateRunning(touchEvents, deltaTime);

        if (state == GameState.Paused)
            updatePaused(touchEvents);

        if (state == GameState.GameOver)
            updateGameOver(touchEvents);
    }

    private void updateReady(List<TouchEvent> touchEvents) {
        if (touchEvents.size() > 0)
            state = GameState.Running;
    }

    private void updateRunning(List<TouchEvent> touchEvents, float deltaTime) {

        //Here I would like to have SharedPreferences

        int len = touchEvents.size();

        for (int i = 0; i < len; i++) {
            TouchEvent event = touchEvents.get(i);
            if (event.type == TouchEvent.TOUCH_DOWN) {
                if (event.x > 80) {
                    ...
                }
                if (event.x < 20) {
                    ...
                }
            }

            if (event.type == TouchEvent.TOUCH_UP) {
                ...

                if (inBounds(event, 220, 0, 40, 40)) {
                    ...
                }

            }

        }

        if (robot.getCenterY() > 200) {
            ...
        }
    }


    private void updatePaused(List<TouchEvent> touchEvents) {
        ...
    }

    private void updateGameOver(List<TouchEvent> touchEvents) {
        ...
    }

    private void updateTiles() {
        ...
    }

    @Override
    public void paint(float deltaTime) {
        ...
    }

    private void nullify() {
        ...
    }

    private void drawReadyUI() {
        ...
    }

    private void drawRunningUI() {
        ...
    }

    private void drawPausedUI() {
        ...
    }

    private void drawGameOverUI() {
        ...
    }

    @Override
    public void pause() {

        if (state == GameState.Running)
        state = GameState.Paused;
    }

    @Override
    public void resume() {

        if (state == GameState.Paused)
        state = GameState.Running;
    }

    @Override
    public void dispose() {

    }

    private void goToMenu() {
        game.setScreen(new MainMenuScreen(game));
    }

    public static Robot getRobot() {
        return robot;
    }

}

由于我是 Android 和 Java 的初学者,如果您可以编写使其正常工作所需的实际代码,那将非常有帮助,因为像“你应该这样做......”这样的 cmets 不幸地并不意味着对我很重要。谢谢。

【问题讨论】:

  • 在您的应用程序类中编写您的 sharedPreference 代码。在你的 updateRunning 方法中调用该方法。
  • 您应该在 Application 类中使您的 SP 对象成为全局对象。

标签: java android


【解决方案1】:

请参考: How to use SharedPreferences in Android to store, fetch and edit values

您唯一应该修改的是“this”对象,在您的情况下,它应该是您传递给 GameScreen 对象的上下文(您应该将上下文传递给 GameScreen 构造函数),然后: mContext.getSharedPreferences(name, mode);

【讨论】:

    【解决方案2】:

    您需要将 Context 传递给您的 GameScreen 类..然后定义 pref 如下

    SharedPreferences settings = context.getSharedPreferences("Prefs", 0);
    

    更多详情click here

    【讨论】:

    • 很想将上下文传递给 GameScreen 类?在其他类中,我有 Context context = this;,但是当我尝试将它与 SharedPreferences settings = OtherClass.context.getSharedPreferences("Prefs", 0); 一起使用时,出现错误“无法引用非静态字段 'context'来自静态上下文”。这是因为上下文不是静态的。如果我将其设为静态,则会出现错误“'com..OtherClass.this' 无法从静态上下文中引用”。
    • 将上下文参数添加到您的 GameScreen 构造函数中,例如 --> public GameScreen(Game game,Context context);并从您调用 GameScreen 的位置传递 Context 值...
    【解决方案3】:

    由于您似乎在使用 LIBGDX,您应该使用Gdx.app.getPreferences() 来获取首选项对象。这种用法将使您能够更加不受平台限制地了解您的偏好。

    http://code.google.com/p/libgdx/wiki/Preferences

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2014-04-21
      相关资源
      最近更新 更多