2012-02-28 68 views
0

我對Java和Android有點新,並且遇到類和活動的麻煩。我正在清理我的代碼,並將大量的代碼從MainActivity移到不同的類中,但我只能通過創建新的活動而不是類來使應用程序工作。將活動更改爲類 - Android

  • 我需要留在主視圖,只是使用類的方法
  • 從主要活動按鈕,倒計時,然後調用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 
     } 
    } 

} 
+0

儘量尊重,先學習Java,同時不要學習Android的負擔。我相信你不會理解這個建議,但是一旦你對Java有了一個明確的理解,你就會明白這對你來說是最好的行動方式。 – mah 2012-02-28 12:34:38

回答

0

我編輯您的文章更加清晰,因爲這個問題很有意思。這是許多新開發人員在開始使用android時遇到的困境。相信我,我看到了真正糟糕的代碼。在正確的時間得到正確的建議非常重要。所以在這裏。

您正處在正確的軌道上。每個視圖都必須有自己的活動。不要擺脫那種習慣。如果你使用java的方式,那麼你就不想使用activity,但這會讓你成爲一個非常糟糕的android開發者。

是的,你需要閱讀更多關於如何編寫Android應用程序。

如果您使用1視圖1活動原則,android操作系統將支持你很多。例如,支持按順序返回的後退按鈕。

+0

碎片發生了什麼? – Bostone 2012-03-03 20:30:21

+0

不明白你的問題? – 2012-03-14 06:07:20

0

一般的做法是:

讓他們班(除去延伸活動),並contructors爲此接受上下文參數兩類。準備你的方法,並在主要活動中創建類的新實例,以便可以使用它的方法。可能你需要適應一些東西,但它不應該是一個大問題。

BTW:建議所有長操作(如位置更新,HTTP發送/收到)使用threads/background operation進行管理,所以你的用戶界面是未被凍結,並且你避免ANR強制關閉..

+0

你可以給我一個例子,我的代碼?只是爲了讓我開始。如果我從LocationActivity中刪除extends Activity部分,'getSystemService'會引發一個錯誤,並要求我爲它創建一個方法。 – mkyong 2012-02-28 12:49:31

0

活動是一類。說如果你需要做任何使用外部服務的操作或者做一些可能很長的事情,那麼最好使用AsyncTask來完成它自己的線程。請詳細說明refer to this article