我对Java和Android有些新手,我在课程和活动方面遇到了麻烦。我正在清理我的代码并将其中的很多内容从我的MainActivity移动到不同的类,但我只能通过创建新的活动而不是类来使应用程序工作。
这是我能让它工作的唯一方法,因为我只需要启动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 :(得分:0)
为了更清晰,我编辑了你的帖子,因为这个问题很有趣。这是许多新开发人员在开始使用android时遇到的两难问题。相信我,我看到了非常糟糕的代码。在正确的时间获得正确的建议非常重要。所以这里。
你走在正确的轨道上。每个视图都必须有自己的活动。不要摆脱这种习惯。如果你采用java方式,那么你很想不使用activity,但这会让你成为一个非常糟糕的android开发者。
是的,你需要阅读更多关于如何编写Android应用程序的内容。
如果您使用1视图1活动原则,Android操作系统将为您提供很多支持。例如,将支持按顺序向后移动的后退按钮。
答案 1 :(得分:0)
一般方法是:
使它们成为类(删除 extends Activity ),并为接受上下文作为参数的两个类创建构造函数。准备你的方法,并在main活动中创建类的新实例,以便你可以使用它的方法。可能你需要调整一些东西,但它不应该是一个大问题。
btw:建议使用threads/background operation管理所有长时间操作(如位置更新,http发送/接收),这样您的用户界面就不会被冻结,您可以避免ANR强制关闭..
答案 2 :(得分:0)
活动是一个类。说如果你需要做任何使用外部服务的操作或做一些可能冗长的事情你最好使用AsyncTask在它自己的线程上做它。有关详细信息,请refer to this article