10

Still being relatively new to this I'm having issues in finding a view in a non-activity class MyLocation which I'm using in my activity class MainActivity. I'm using MyLocation to get longitude and latitude. I want to highlight a textview when either GPS or Network has been used. To do so I need to find the textviews in the non-activity class MyLocation.

Here is how I'm calling it in MainActivity:

public class MainActivity extends ActionBarActivity implements LocationListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

            MyLocation myLocation = new MyLocation();
            myLocation.getLocation(this, locationResult);

}

And here what I tried in MyLocation to find the textviews:

public class MyLocation {

LocationManager lm;
LocationResult locationResult;
private Context context;
TextView tvnetwork, tvgps;
private int defaultTextColor;

LocationListener locationListenerNetwork = new LocationListener() {
    public void onLocationChanged(Location location) {

        locationResult.gotLocation(location);

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.main, null);

        tvnetwork = (TextView) v.findViewById(R.id.tvnetwork);
        tvgps = (TextView) v.findViewById(R.id.tvgps);
        defaultTextColor = tvgps.getTextColors().getDefaultColor();

        tvnetwork.setTextColor(context.getResources().getColor(
                R.color.green));
        tvgps.setTextColor(defaultTextColor);

        lm.removeUpdates(this);
        lm.removeUpdates(locationListenerGps);
    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

But the views are not found. I already get a NPE @ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);. What am I doing wrong?

sascha
  • 265
  • 2
  • 4
  • 13

3 Answers3

14

get a NPE @ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);. What am I doing wrong?

Because context is null in MyLocation class. use MyLocation class constructor to pass MainActivity context in MyLocation to access system services as:

Activity activity;
public MyLocation(Context context,Activity activity){
this.context=context;
this.activity=activity;
}

and in MainActivity create MyLocation class object by passing MainActivity context as:

MyLocation myLocation = new MyLocation(MainActivity.this,this);

Now use context to access system services in MyLocation class

EDIT: Instead of inflating main layout again in onLocationChanged use Activity context to access view from Activity Layout as:

 public void onLocationChanged(Location location) {

       ....
        tvnetwork = (TextView) activity.findViewById(R.id.tvnetwork);
        tvgps = (TextView) activity.findViewById(R.id.tvgps);
        defaultTextColor = tvgps.getTextColors().getDefaultColor();

        tvnetwork.setTextColor(context.getResources().getColor(
                R.color.green));
        tvgps.setTextColor(defaultTextColor);

       ....
    }
ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
  • Great, thanks a lot, no NPE anymore. But my textview doesn't change the color. Any hint for this? – sascha Sep 12 '14 at 11:37
1

Try this way,hope this will help you to solve your problem.

public class MainActivity extends ActionBarActivity implements LocationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MyLocation myLocation = new MyLocation(this);
        myLocation.getLocation(this, locationResult);

    }
}

public class MyLocation {

    LocationManager lm;
    LocationResult locationResult;
    private Context context;
    TextView tvnetwork, tvgps;
    private int defaultTextColor;

    public void MyLocation(Context context) {
        this.context = context;
    }

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {

            locationResult.gotLocation(location);

            View v = LayoutInflater.from(context).inflate(R.layout.main, null);

            tvnetwork = (TextView) v.findViewById(R.id.tvnetwork);
            tvgps = (TextView) v.findViewById(R.id.tvgps);
            defaultTextColor = tvgps.getTextColors().getDefaultColor();

            tvnetwork.setTextColor(context.getResources().getColor(
                    R.color.green));
            tvgps.setTextColor(defaultTextColor);

            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };
}
Haresh Chhelana
  • 24,720
  • 5
  • 57
  • 67
0

Why you want to do it in separate class as your are implementing "LocationListener" in Activity itself. And if you want to do in separate class. You can notify the activity by setting custom listners like this

public class MainActivity extends ActionBarActivity implements LocationListener,CustomListner {

        TextView tvnetwork, tvgps;
        private int defaultTextColor;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tvnetwork = (TextView) v.findViewById(R.id.tvnetwork);
            tvgps = (TextView) v.findViewById(R.id.tvgps);
            defaultTextColor = tvgps.getTextColors().getDefaultColor();
            MyLocation myLocation = new MyLocation(this); // pass listner in constructor
            myLocation.getLocation(this, locationResult);

        }
        @Override
        public void highlight(){
              // update your view here.
              tvnetwork.setTextColor(context.getResources().getColor(
                        R.color.green));
                tvgps.setTextColor(defaultTextColor);
        }



        public class MyLocation {

        LocationManager lm;
        LocationResult locationResult;
        CustomListner listner;

        MyLocation(CustomListner listner){
        this.listner = listner;
        }

        public interface CustomListner{
                 public void highlight();
        }
        LocationListener locationListenerNetwork = new LocationListener() {
            public void onLocationChanged(Location location) {

                locationResult.gotLocation(location);

                listner.highlight();

                lm.removeUpdates(this);
                lm.removeUpdates(locationListenerGps);
            }

            public void onProviderDisabled(String provider) {
            }

            public void onProviderEnabled(String provider) {
            }

            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
}
John
  • 8,846
  • 8
  • 50
  • 85
  • Thanks a lot for solution but I prefer to have the class separated as this keeps the activity cleaner for me and I can reuse it easier for another project ;-) Thanks again! – sascha Sep 12 '14 at 11:59