2014-09-12 13 views
7

Ancora relativamente nuovo a questo sto avendo problemi nel trovare una vista in una classe di non attività MyLocation che sto usando nella mia classe di attività MainActivity. Sto usando MyLocation per ottenere longitudine e latitudine. Voglio evidenziare una vista testuale quando è stato utilizzato il GPS o la rete. Per fare ciò ho bisogno di trovare le visuali testuali nella classe di non attività MyLocation.findViewById nella classe non di attività

Ecco come sto chiamando 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); 

} 

Ed ecco quello che ho cercato in MyLocation per trovare le 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) { 
    } 
}; 

Ma il punto di vista non si trovano. Ho già un NPE @.getSystemService(Context.LAYOUT_INFLATER_SERVICE);. Che cosa sto facendo di sbagliato?

+0

Dove è stato definito il metodo 'getLocation'? –

+0

molto semplice ... quando si chiama la classe MyLocation..è sufficiente aggiungere contesto come parametro e quindi è possibile ottenere tutte le cose da lì. – GvSharma

risposta

11

ottenere un NPE @ .getSystemService (Context.LAYOUT_INFLATER_SERVICE) ;. Cosa sto sbagliando?

Perché context è null in MyLocation classe. utilizzare MyLocation costruttore di classe a passare MainActivity contesto in MyLocation per accedere ai servizi di sistema come:

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

e in MainActivity creare MyLocation oggetto di classe passando contesto MainActivity come:

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

Ora usare context per accedere ai servizi di sistema in MyLocation classe

MODIFICA: Invece di gonfiare il layout principale di nuovo nel contesto dell'uso attività onLocationChanged per accedere vista dal layout di attività come:

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); 

     .... 
    } 
+0

Grande, grazie mille, niente più NPE. Ma la mia vista testuale non cambia il colore. Qualche suggerimento per questo? – sascha

+0

@sascha: vedi la mia risposta edit –

+0

Questo ha fatto il trucco, grazie mille! – sascha

0

Perché si vuole fare in classe separata come stanno attuando "LocationListener" in attività stessa. E se vuoi fare in una classe separata. È possibile comunicare l'attività impostando listners personalizzati come questo

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) { 
      } 
     }; 
} 
+0

Grazie mille per la soluzione ma preferisco avere la classe separata in quanto mantiene l'attività più pulita per me e posso riutilizzarla più facilmente per un altro progetto ;-) Grazie ancora! – sascha

0

provare in questo modo, spero che questo vi aiuterà a risolvere il tuo problema.

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) { 
     } 
    }; 
} 
Problemi correlati