1

ラジオボタンがあるステージからインスタンスを削除すると、インスタンスを再度作成すると、ラジオボタンが最後の選択を保持するため、ラジオボタンに問題があります。

(私はスペイン語でクラスを書きました。概念を特定するのに問題がある場合は、私に尋ねてください)

クラス ( crearPregunta.as または askQuestion.as )

package src.com.akkadian

{

import fl.controls.RadioButtonGroup;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.*;
import flash.events.MouseEvent;
import flash.net.*;
import flash.text.*;
import flash.utils.Timer;
import flash.xml.*;
import src.com.akkadian.manipularXML;

public class crearPregunta extends MovieClip
{

    private static var _instance:crearPregunta = null;

    private var xmlPath:String;
    private var radioGroup1:RadioButtonGroup = new RadioButtonGroup("Questions");
    private var xmlLoader:URLLoader = new URLLoader();
    private var instanciaXML:manipularXML;
    protected var time:Timer;
    private var rs:String;
    private var resp:XMLList;
    private var re:XMLList;
    private var pre:XMLList;
    private var opSeleccionada:Number;
    private var resultado:Boolean = false;

    public function crearPregunta()
    {


    }

    public static function getInstance():crearPregunta
    {

        if (_instance == null)
        {

            _instance = new crearPregunta();

        }

        return _instance;
    }

    private function generarContenido()
    {

        // Crea the XML instance from manipularXML class
        this.instanciaXML = manipularXML.generarInstancia();

        // Send the path of the file
        this.xmlPath = "src/com/akkadian/preguntas.xml";

        // Add the listener to proceed when the load is finished        
        xmlLoader.addEventListener(Event.COMPLETE, inXML);
        xmlLoader.load(new URLRequest(this.xmlPath));

        // adding a listener to the button sendResponse
        enviarRespuesta.addEventListener(MouseEvent.CLICK, recibirRespuesta);
        enviarRespuesta.buttonMode = true;

    }

    public function validarRespuesta(opcionSeleccionada:String):Boolean
    {
        // Option chosen
        opSeleccionada = Number(opcionSeleccionada);

        // Generate the content
        generarContenido();

        // Send the result
        return resultado;
    }

    private function inXML(e:Event):void
    {
        // Add the radiobuttons to an Array
        var radios:Array = [casoA, casoB, casoC];

        // Obtain the data from the XML
        var data = instanciaXML.obtenerInfo(e.target.data);


        for each (var nodo:XML in data.pregunta)
        {

            if (nodo.@id == opSeleccionada)
            {
                // Keep the answer for the option chosen
                resp = data.pregunta[opSeleccionada - 1].respuesta;

                // Keep the value for the option chosen
                re = data.pregunta[opSeleccionada - 1].respuesta.@valor;

                // Keep the question
                pre = data.pregunta[opSeleccionada - 1].@pre

                // add the value of the question to the dinamic textfield
                question.text = pre;

                for (var u:uint = 0; u < radios.length; u++)
                {

                    radios[u].group = radioGroup1;
                    radios[u].textField.multiline = true;
                    radios[u].textField.wordWrap = true;
                    radios[u].textField.width = 230;
                    radios[u].textField.height = 100;
                    radios[u].textField.autoSize = TextFieldAutoSize.LEFT;


                    // Add the answers to the labels
                    radios[u].label = resp[u];

                    // Add the answers to the values
                    radios[u].value = re[u];

                }

            }

        }
    }

    private function recibirRespuesta(m:MouseEvent)
    {

        for each (var tre:XML in re)
        {
            // if the value of the answer is equal to the value stored
            if (this.radioGroup1.selection.value == re)
            {
                // Save the result as true
                this.resultado = true;

                // Add the value of the answer to the textfield included on this Instance
                result_txt.text = "Correcto";
            }
            else
            {
                // Save the result as false
                this.resultado = false;

                // Add the value of the answer to the textfield included on this Instance
                result_txt.text = "Incorrecto";
            }
        }

        // Add a function to create a timer
        agregarTimer();

    }

    private function agregarTimer()
    {
        // Setup the timer
        time = new Timer(1000, 1);
        time.addEventListener(TimerEvent.TIMER_COMPLETE, cerrarTimer);
        time.start();

    }

    private function cerrarTimer(t:TimerEvent)
    {
        // Just for information, I verify which are the instances that at present ran in the Main instance
        Main.Instancia.obtenerNombreHijos();

        // Remove the instance askQuestion from the Main
        Main.Instancia.removeChildAt(2);

        // I certify that the instance is deleted
        Main.Instancia.obtenerNombreHijos();

        // I change the instance of the xml class to null
        instanciaXML = null;


    }

}

}

結果:今何が起きている?

  1. ユーザーはトリビアを実行します。最初に、開始オプションを選択します (オプションのグリッドが作成されます)。
  2. ユーザーは 1 つのオプションを選択します ( askQuestion インスタンスが作成されます)。
  3. ユーザーがラジオボタンからオプションを選択すると (結果は result_txt.text に表示されます)
  4. タイマーが実行されます
  5. Main クラスからインスタンス ( askQuestion ) を削除します。
  6. ユーザーが別のオプションを選択した場合、質問と回答は正しく表示されますが、ラジオボタンは以前に選択されたオプションを保持し、result_txt.text はこの選択の結果を示します。選択を行う必要がないため、これは間違っています。

私はこれから別の状況を持っています.. 私はこれを持っています: 静的インスタンス a (ここではインスタンス c が作成されます) 静的インスタンス b (ここでは操作の結果です。このインスタンスは結果が取得されると削除されます) インスタンス c (結果は表示されます)インスタンスbからインスタンスcに情報を送信するには、インスタンスがインスタンスaで作成された場合にどうすればよいですか

4

2 に答える 2

1

Flashで何かを削除するには、つまりガベージコレクターの準備をするには、オブジェクトからすべてのリスナーを削除し、ステージから削除してからnullに設定してみてください。

于 2012-07-28T08:08:51.183 に答える
0

問題は、毎回同じラジオボタングループを再利用していることだと思いますが、そのラジオボタングループのselectedIndexまたはselectedValueをリセットしていません。これで問題が解決すると思います。

            radioGroup1.selectedIndex=-1;
            for (var u:uint = 0; u < radios.length; u++)
            {

                radios[u].group = radioGroup1;
                radios[u].textField.multiline = true;
                radios[u].textField.wordWrap = true;
                radios[u].textField.width = 230;
                radios[u].textField.height = 100;
                radios[u].textField.autoSize = TextFieldAutoSize.LEFT;


                // Add the answers to the labels
                radios[u].label = resp[u];

                // Add the answers to the values
                radios[u].value = re[u];

            }
于 2012-07-28T19:06:26.543 に答える