Изменение деятельности на классы - Android - PullRequest
0 голосов
/ 28 февраля 2012

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

  • Мне нужно остаться в главном окне и просто использовать методы класса
  • От основного действия кнопка, ведет обратный отсчет и затем вызывает LocationActivity.
  • LocationActivity находит координаты GPS и затем отправляет их в SendActivity.

Это единственный способ заставить его работать, потому что мне просто нужно было запустить locationListener, поэтому я просто запустил его в разделе onCreate.

MainActivity.java

    public class MainActivity extends Activity {

    Button mCloseButton;
    Button mOpenButton;
    MultiDirectionSlidingDrawer mDrawer;

    private Button send_button;
    Button sendButton;
    EditText msgTextField;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature( Window.FEATURE_NO_TITLE );
        setContentView(R.layout.main);

        send_button = (Button)findViewById(R.id.button2); 

        mDrawer.open();

        mCloseButton.setOnClickListener( new OnClickListener() {
            public void onClick( View v )
            {
                mDrawer.animateClose();
            }
        });

        mOpenButton.setOnClickListener( new OnClickListener() {

            public void onClick( View v )
            {
                if( !mDrawer.isOpened() )
                    mDrawer.animateOpen();
            }
        });

        final SharedPreferences shared = getSharedPreferences("PEOPLE_PREFERENCES", MODE_PRIVATE);
        final String first = shared.getString("FIRSTNAME", "");
        final String last = shared.getString("LASTNAME", "0");


       ///////Profile Button//////////////// 
        Button profile = (Button) findViewById(R.id.button1);
        profile.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, PreferencesActivity.class));
            }
        });
        ///////////////////////////////////

       //////Generate ID//////////////////
        if (usr_id == null) {

            char[] chars = "abcdefghijklmnopqrstuvwxyzABSDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
            Random r = new Random(System.currentTimeMillis());
            char[] id = new char[8];
            for (int i = 0;  i < 8;  i++) {
                id[i] = chars[r.nextInt(chars.length)];
            }
            usr_id = new String(id);
            Editor editor = shared.edit();
            editor.putString("USR_ID", usr_id);
            editor.commit();
        }
        //////////////////////////////////                 

        ////////Send Alert////////////////
        ///////Begin Timer///////////////
        send_button.setOnClickListener(new OnClickListener() {

            private boolean running = false;
            private CountDownTimer timer;
            public void onClick(View v) {
              if(!running)
              {
                running = true;
                timer = new CountDownTimer(4000, 1000) {

                    @Override
                    public void onFinish() {
                        send_button.setText("SENT");  
                        startActivity(new Intent(MainActivity.this, LocationActivity.class));
                        SendUserActivity.sendId(usr_id1, first, last);                                          
                    }

                    @Override
                    public void onTick(long sec) {
                        send_button.setText("CANCEL (" + sec / 1000 + ")");

                    }
                }.start();
              }
              else
              {
                 timer.cancel();
                 send_button.setText("Send!");
                 running = false;
              }
            }
        });
    }  
    ///////////////////////////////////


    @Override
   public void onContentChanged()
   {
    super.onContentChanged();
    mCloseButton = (Button) findViewById( R.id.button_open );
    mOpenButton = (Button) findViewById( R.id.button_open );
    mDrawer = (MultiDirectionSlidingDrawer) findViewById( R.id.drawer );
   }
}

LocationActivity.java

    package com.alex.www;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;

public class LocationActivity extends Activity {


    private LocationManager locManager;
    private LocationListener locListener;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startLocation();
    }

    void startLocation()
    {   

        SharedPreferences shared = getSharedPreferences("PEOPLE_PREFERENCES", MODE_PRIVATE);
    final String usr_id2 = shared.getString("USR_ID", "none");

    //get a reference to the LocationManager
    locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);


    //checked to receive updates from the position
    locListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            SendActivity.send(location, usr_id2);
        }
        public void onProviderDisabled(String provider){
            //labelState.setText("Provider OFF");
        }
        public void onProviderEnabled(String provider){
            //labelState.setText("Provider ON ");
        }
        public void onStatusChanged(String provider, int status, Bundle extras){
            Log.i("", "Provider Status: " + status);
            }
        };

        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
    }
}

SendActivity.java

    package com.alex.www;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.SharedPreferences;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SendActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static void send(Location loc, String usr_id2)
    {

         Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));

         String lat = String.valueOf(loc.getLatitude()); 
         String lon = String.valueOf(loc.getLongitude());

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://example.com/test/example.php");

         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
           nameValuePairs.add(new BasicNameValuePair("lat", lat)); 
           nameValuePairs.add(new BasicNameValuePair("lon", lon));
           nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
         } 
         catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } 
         catch (IOException e) {
             // TODO Auto-generated catch block
         }
    }

}

Ответы [ 3 ]

0 голосов
/ 28 февраля 2012

Общий подход будет следующим:

Сделать их классами (удалить расширяет активность ) и создать конструкторы для обоих классов, которые принимают контекст в качестве параметра.Подготовьте ваши методы и в основном упражнении создайте новый экземпляр класса, чтобы вы могли использовать его методы.Возможно, вам придется адаптировать некоторые вещи, но это не должно быть большой проблемой.

Кстати: рекомендуется, чтобы все длинные операции (например, обновление местоположения, отправка / получение http) выполнялись с помощью потоки / фоновая операция , поэтому ваш пользовательский интерфейс не заморожен и вы избегаете принудительного закрытия ANR ..

0 голосов
/ 28 февраля 2012

Активность - это класс. Сказал, что если вам нужно выполнить какую-либо операцию, которая использует внешние сервисы или делает что-то потенциально длительное, вам гораздо лучше использовать AsyncTask, которая делает это в своем собственном потоке. Пожалуйста, обратитесь к этой статье для подробностей

0 голосов
/ 28 февраля 2012

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

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

Да, вам нужно немного больше прочитать о том, как написать приложение для Android.

Если вы используете принцип действия «1 просмотр 1», ОС Android вас сильно поддержит.Например, кнопка возврата назад в последовательности будет поддерживаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...