Переменные метода onCreate недоступны? - PullRequest
0 голосов
/ 03 сентября 2011

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

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

Я понимаю, что, только показывая фрагменты кода, я мог скрыть проблему, но мой оригинал слишком громоздкий и обширный, чтобы публиковать ОДНАКО, он был основан на великолепном учебнике Мартина http://www.droidnova.com/android-3d-game-tutorial-part-i,312.html

Итак, я вернулся к первым принципам и просто добавил проблемную часть в этот учебный код, и моя проблема была воспроизведена. Итак, вот полный код:

Vortex.java **

package com.clockworkrobot.vortex;

import android.app.Activity;
import android.os.Bundle;

public class Vortex extends Activity {
    private static final String LOG_TAG = Vortex.class.getSimpleName();
    private VortexView _vortexView;

    private float _red ;  // these are the values that actually reach VortexRender class
    private float _green = 1f ; // touch the screen, it will turn green.
    private float _blue ;  // but why don't the variable in my onCreate override these?

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        _red = 1f;    // The test values I want to reach my Vortex Renderer class.
        _green = 0f;  // to help debug. they should make the screen magenta
        _blue = 1f;  // Eventually these value will be loaded during onCreate

       setRed(_red);  // I don't think these are needed 
       setGreen(_green); // But since the variable within this method
       setBlue(_blue); // don't appear to be reaching their target..worth a try

        _vortexView = new VortexView(this);
        setContentView(_vortexView);
    }

    public float getRed() {
        return _red;       
    }

    public void setRed(float value) {
        _red = value;
    }

    public float getGreen() {
        return _green;       
    }

    public void setGreen(float value) {
        _green = value;
    }

    public float getBlue() {
        return _blue;       
    }

    public void setBlue(float value) {
        _blue = value;
    }


}

VortexRender.java **

package com.clockworkrobot.vortex;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class VortexRenderer extends Activity implements GLSurfaceView.Renderer {
private static final String LOG_TAG = VortexRenderer.class.getSimpleName();

 //   Vortex sw = new Vortex();

private Vortex sw;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sw = new Vortex();
}

    private float _red = 0f;
    private float _green = 0f;
    private float _blue = 0f;

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Do nothing special.
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        gl.glViewport(0, 0, w, h);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // define the color we want to be displayed as the "clipping wall"
        gl.glClearColor(_red, _green, _blue, 1.0f);
        // clear the color buffer to show the ClearColor we called above...
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }

    public void setColor(float r, float g, float b) {

        _red = sw.getRed();     // Want these to grab the values from my onCreate method
        _green = sw.getGreen(); // But instead it's getting the nul values
        _blue = sw.getBlue();   // eg values as set above me onCreate.

//        _red = r;
//        _green = g;
//        _blue = b;

    }
}

VortexView.java **

package com.clockworkrobot.vortex;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;

public class VortexView extends GLSurfaceView {
    private static final String LOG_TAG = VortexView.class.getSimpleName();
    private VortexRenderer _renderer;

    public VortexView(Context context) {
        super(context);
        _renderer = new VortexRenderer();
        setRenderer(_renderer);
    }

    public boolean onTouchEvent(final MotionEvent event) {
        queueEvent(new Runnable() {
            public void run() {
                _renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
            }
        });
        return true;
    }
}

AndroidManifest.xml **

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.clockworkrobot.vortex"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Vortex"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest> 

По сути. Мне нужен способ сохранить и восстановить текущий цвет экрана при открытии и закрытии игры. Спасибо всем, кто помог до сих пор.

1 Ответ

0 голосов
/ 03 сентября 2011

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

Используйте SharedPreferences - вот почему они есть.

Кто-нибудь получил какие-нибудь полезные идеи?

Либо:

  • Ваш другой класс не разговаривает с Activity объектом, который вы считаете, или
  • Вы не вызываете код в другом классе, который вызывает ваш установщик, или
  • Ваша активность в данный моментвоссоздан (например, изменение конфигурации) как часть вашего тестирования, или
  • Как отмечает @Arnout Engelen, вы вызываете сеттер из нескольких мест и перезаписываете то, что хотите, или
  • что-то ещепоскольку приведенный выше код, скорее всего, на самом деле не является кодом из вашего приложения, а поддельные примеры, подобные этому, просто вызывают проблемы, когда вы обращаетесь к людям за помощью, потому что вы вводите различия между тем, что вы действительно выполняете, и тем, чтовы утверждаете, что используете

ОБНОВЛЕНИЕ Вы создаете Vortex через new Vortex().Vortex является Activity.Никогда не создавайте действия через конструктор.Вы не получаете доступ к действиям из других действий.Ваши красные / зеленые / синие значения должны быть доступны в какой-либо модели данных из всех ваших компонентов.

Учитывая ваш код и комментарии, я настоятельно рекомендую вам сначала изучить Java вне Android, а затем изучить Android.

...