我对android编程有疑问。我有一个MainActivity类和实现LocationListner的类。我想从第二个类中更改onLocationChanged方法中的一些UI元素,但我不知道应该如何完成这样的事情。
这是我的mainActivity:
public class MainActivity extends AppCompatActivity {
private LocationGPS gps;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableGPS();
initGuiElements();
}
private void enableGPS()
{
gps = new LocationGPS(this);
}
private void initGuiElements()
{
text = (TextView) findViewById(R.id.textTop);
text.setText("nothing yet");
}
}
这是我的位置课程。
public class LocationGPS implements LocationListener {
private Activity mainActivity;
private LocationManager locationManager;
public LocationGPS(Activity activity)
{
this.mainActivity = activity;
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
//here I want to set text for TextView element
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
答案 0 :(得分:1)
你有很多方法可以做到这一点,我将给出2个:
更改您的活动以实现LocationListener,当您调用locationManager.requestLocationUpdates时,将活动作为侦听器传递,这样您将获得在Activity中调用的回调,而不是在LocationGPS类中,MainActivity将会看到像:
public class MainActivity extends AppCompatActivity
implements LocationListener {
private LocationGPS gps;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableGPS();
initGuiElements();
}
private void enableGPS() {
gps = new LocationGPS(this);
}
private void initGuiElements() {
text = (TextView) findViewById(R.id.textTop);
text.setText("nothing yet");
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
和LocationGPS类:
public class LocationGPS {
private Activity mainActivity;
private LocationManager locationManager;
public LocationGPS(Activity activity) {
this.mainActivity = activity;
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mainActivity);
}
}
您可以在MainActivty中创建需要传递给LocationGPS类的通信接口的第二种方法,一旦您想要更新活动中的UI,您可以通过下一种方式调用此接口方法:
public class MainActivity extends AppCompatActivity implements
MainActivity.MainActivityInteractionInterface{
private LocationGPS gps;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableGPS();
initGuiElements();
}
private void enableGPS() {
gps = new LocationGPS(this, getApplicationContext());
}
private void initGuiElements() {
text = (TextView) findViewById(R.id.textTop);
text.setText("nothing yet");
}
@Override
public void updateUI() {
text.setText("Some new text");
}
public interface MainActivityInteractionInterface {
void updateUI();
}
}
而LocationGPS现在看起来像:
public class LocationGPS implements LocationListener{
private MainActivity.MainActivityInteractionInterface interactionInterface;
private LocationManager locationManager;
private Context applicationContext;
public LocationGPS(MainActivity.MainActivityInteractionInterface interactionInterface, Context applicationContext) {
this.interactionInterface = interactionInterface;
this.applicationContext = applicationContext;
locationManager = (LocationManager) applicationContext.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
interactionInterface.updateUI(); // Or call this method whenever you need
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
答案 1 :(得分:1)
我发现Artyom Okun的第二个代码建议最有帮助,但是确实需要进行一些调试。我必须将接口移到它自己的文件中。这是由于“循环继承”导致您尝试继承要在活动中创建的对象。
See this stackoverflow page explaining the issue
MainActivity.java
public class MainActivity extends AppCompatActivity implements
MainActivityInteractionInterface{
private LocationGPS gps;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableGPS();
initGuiElements();
}
private void enableGPS() {
gps = new LocationGPS(this, getApplicationContext());
}
private void initGuiElements() {
text = (TextView) findViewById(R.id.textTop);
text.setText("nothing yet");
}
@Override
public void updateUI() {
text.setText("Some new text");
}
}
LocationGPS.java
public class LocationGPS implements LocationListener{
private MainActivityInteractionInterface interactionInterface;
private LocationManager locationManager;
private Context applicationContext;
public LocationGPS(MainActivityInteractionInterface interactionInterface, Context applicationContext) {
this.interactionInterface = interactionInterface;
this.applicationContext = applicationContext;
locationManager = (LocationManager) applicationContext.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
interactionInterface.updateUI(); // Or call this method whenever you need
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
然后新建文件MainActivityInteractionInterface.java
public interface MainActivityInteractionInterface {
void updateUI();
}
要更新UI,我要在LocationGPS类的onLocationChanged()方法中更新全局变量。然后在updateUI()中,我使用全局变量写入文本视图。
注意在MainActivity中向全局写入如下内容:
MainActivity.bestLat =纬度;
答案 2 :(得分:0)
在MainActivity中创建方法
public void updateText(String updatedText){
text.setText(updatedText);
}
在LocationGPS类中,您已经拥有MainActivity的上下文,因此在onLocationChanged中,调用此方法
mainActivity.updateText(updatedText);
还有另一种推荐方式。创建一个接口并在onLocationChanged方法中调用它。在MainActivity和实现的界面中实现更新文本。 我更喜欢这种方法,因为您不需要共享Activity的上下文或rootview,以防止可能的内存泄漏。
答案 3 :(得分:0)
只需将LocationGps类放在MainActivity类中。完成。 抱歉无法发表评论,以便发帖回答。
答案 4 :(得分:0)
这可以帮助你
public class LocationGPS implements LocationListener {
private Activity mainActivity;
private LocationManager locationManager;
public interface OnChangeListener{
public void onChangeListener();
}
OnChangeListener mOnChangeListener;
public LocationGPS(Activity activity,OnChangeListener onChangeListener)
{
this.mainActivity = activity;
mOnChangeListener = onChangeListener;
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
//here I want to set text for TextView element
mOnChangeListener.onChangeListener();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
Activity必须实现接口OnChangeListener
public class MainActivity extends AppCompatActivity implements OnChangeListener {
private LocationGPS gps;
private TextView text;
@Override
public void onChangeListener(){
//For example you may edit TextView
text.setText("data recieved:onLocationChanged")
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
enableGPS();
initGuiElements();
}
private void enableGPS()
{
//You transfer interface
gps = new LocationGPS(this,this);
}
private void initGuiElements()
{
text = (TextView) findViewById(R.id.textTop);
text.setText("nothing yet");
}