Android Studio - Instrukcja pod "switchem" wykonuje się dopiero po jego przełączeniu

0

Witam, napisałem następujący program:

package com.example.kamil.surveycalc;

import android.content.pm.ActivityInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

public class azymut extends AppCompatActivity
{
   EditText xp, yp, xk, yk ;
   TextView odleglosc2, azymut2;
   Button poblicz, clear;
   Switch switch1;


   double xp1, yp1, xk1, yk1, dx, dy, d_bazy, odleglosc3, azymut3, azymut4 ;

   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState);
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       setContentView(R.layout.activity_azymut);


       switch1 = (Switch)findViewById(R.id.switch1);
       xp = (EditText)findViewById(R.id.xp);
       yp = (EditText)findViewById(R.id.yp);

       xk = (EditText)findViewById(R.id.xk);
       yk = (EditText)findViewById(R.id.yk);

       odleglosc2 = (TextView)findViewById(R.id.odleglosc2);
       azymut2 = (TextView)findViewById(R.id.azymut2);

       poblicz = (Button)findViewById(R.id.poblicz);
       clear = (Button)findViewById(R.id.clear);


       clear.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v)
           {
               String Text = xp.getText().toString();
               String Text2 = yp.getText().toString();
               String Text3 = xk.getText().toString();
               String Text4 = yk.getText().toString();
               String Text5 = odleglosc2.getText().toString();
               String Text6 = azymut2.getText().toString();


               xp.setText("");
               yp.setText("");
               xk.setText("");
               yk.setText("");
               odleglosc2.setText("0.000");
               azymut2.setText("0.0000");


           }




       });

//POCZĄTEK SWITCHA
       switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
           {
           if (isChecked)
               {
                   Toast.makeText(getApplicationContext(),"Grady", Toast.LENGTH_SHORT).show();
                   poblicz.setOnClickListener(new View.OnClickListener()
                   {
                       @Override
                       public void onClick(View v)
                       {

                           xp1 = Double.parseDouble(xp.getText().toString());
                           yp1 = Double.parseDouble(yp.getText().toString());
                           xk1 = Double.parseDouble(xk.getText().toString());
                           yk1 = Double.parseDouble(yk.getText().toString());


                           dx=xk1-xp1;
                           dy=yk1-yp1;
                           d_bazy = Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));


                           if ((dy>0) && (dx>0))
                           {
                               azymut3=(Math.atan((dy/dx)))*200/Math.PI;
                           }
                           else if ((dy>0) && (dx<0))
                           {
                               azymut3=200-((Math.atan((dy/dx*(-1))))*200/Math.PI);
                           }
                           else if ((dy<0) && (dx<0))
                           {
                               azymut3=200+((Math.atan((dy*(-1)/dx*(-1))))*200/Math.PI);
                           }
                           else if ((dy<0) && (dx>0))
                           {
                               azymut3=400-((Math.atan((dy*(-1)/dx)))*200/Math.PI);
                           }

                           else if((dx==0) && (dy>0))
                           {
                               azymut3=100;
                           }
                           else if((dx==0) && (dy<0))
                           {
                               azymut3=300;
                           }
                           else if((dy==0) && (dx<0))
                           {
                               azymut3=200;
                           }
                           else if((dy==0) && (dx>0))
                           {
                               azymut3=0;
                           }

                           odleglosc3 = Math.round(d_bazy*1000.0)/1000.0;
                           azymut4 = Math.round(azymut3*10000.0)/10000.0;

                           odleglosc2.setText(String.valueOf(odleglosc3));
                           azymut2.setText(String.valueOf(azymut4));



                       }
                   });



               }

               else
                   {
                       Toast.makeText(getApplicationContext(),"Stopnie", Toast.LENGTH_SHORT).show();
                       poblicz.setOnClickListener(new View.OnClickListener()
                       {
                           @Override
                           public void onClick(View v)
                           {

                               xp1 = Double.parseDouble(xp.getText().toString());
                               yp1 = Double.parseDouble(yp.getText().toString());
                               xk1 = Double.parseDouble(xk.getText().toString());
                               yk1 = Double.parseDouble(yk.getText().toString());


                               dx=xk1-xp1;
                               dy=yk1-yp1;
                               d_bazy = Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));


                               if ((dy>0) && (dx>0))
                               {
                                   azymut3=(Math.atan((dy/dx)))*180/Math.PI;
                               }
                               else if ((dy>0) && (dx<0))
                               {
                                   azymut3=180-((Math.atan((dy/dx*(-1))))*180/Math.PI);
                               }
                               else if ((dy<0) && (dx<0))
                               {
                                   azymut3=180+((Math.atan((dy*(-1)/dx*(-1))))*180/Math.PI);
                               }
                               else if ((dy<0) && (dx>0))
                               {
                                   azymut3=360-((Math.atan((dy*(-1)/dx)))*180/Math.PI);
                               }

                               else if((dx==0) && (dy>0))
                               {
                                   azymut3=90;
                               }
                               else if((dx==0) && (dy<0))
                               {
                                   azymut3=270;
                               }
                               else if((dy==0) && (dx<0))
                               {
                                   azymut3=180;
                               }
                               else if((dy==0) && (dx>0))
                               {
                                   azymut3=0;
                               }

                               odleglosc3 = Math.round(d_bazy*1000.0)/1000.0;
                               azymut4 = Math.round(azymut3*10000.0)/10000.0;

                               odleglosc2.setText(String.valueOf(odleglosc3));
                               azymut2.setText(String.valueOf(azymut4));



                           }
                       });

                   }

           }
       });
//KONIEC SWITCHA



   }
}

Program ma obliczać wartość w stopniach lub w gradach w zależności od tego czy przycisk "switch" jest włączony czy też nie. Problem polega na tym, że zadanie pod switchem wykona się dopiero po jednokrotnym jego przełączeniu. Przykład:

  1. Wpisuję dane
  2. Naciskam oblicz
  3. Nic się nie dzieje
  4. Przełączam "switcha"
  5. Naciskam oblicz
  6. Program zwraca wartość w gradach
  7. Przełączam ponownie "switcha"
  8. Program zwraca wartość w stopniach

Jak widać, oba zadania wykonały się poprawnie, jednak dopiero po jednokrotnym przełączeniu switcha. Każde następne przęłączenie również działa prawidłowo.

Korzystając z okazji dopytam o jedną rzecz. Jak zrobić, aby wynik zawsze wyświetlał mi określoną ilośc miejsc po przecinku? Korzystając z tego kodu:

odleglosc3 = Math.round(d_bazy*1000.0)/1000.0;
azymut4 = Math.round(azymut3*10000.0)/10000.0;

Program ucina mi wszystko po pierwszym zerze po przecinku, przykład: jeżeli wynikiem jest 54,1234 jest ok, jeżeli wynikiem jest 54,0000 program zwraca mi 54,0, chciałbym aby zawsze zwracał mi wartość z 4 cyframi po przecinku.

Z góry dziękuję za pomoc,
Pozdrawiam,
Kamil

1

Umieściłeś kod w OnCheckedChangeListener, więc wykonuje się po wystąpieniu tego zdarzenia.

0

A na co powinienem go zamienić?

0

Sam powinieneś wiedzieć w jakiej sytuacji kod powinien się wykonać, skąd ja mam to wiedzieć? Z tego co zrozumiałem masz przycisk oblicz, zatem ten kod powinien być w raczej w onClickListener tego przycisku. Powinien tam być również if sprawdzający czy switch jest włączony.

0

Dzięki za odpowiedź. Nie mogę się z tym jednak uporać. Chodzi mi o to, że niezależnie od pozycji switcha ma się wykonywać przycisk "oblicz". Jeżeli switch jest wyłączony to po kliknięciu "oblicz" bez potrzeby jego przełączania ma się wykonać, powiedzmy "działanie 1+1", po włączeniu switcha i kliknięciu "oblicz" ma się wykonywać "działanie 2+2". Próbowałem wrzucić kod w onClickListener ale nie wyszło ;/

1 użytkowników online, w tym zalogowanych: 0, gości: 1