Исключение нулевого указателя при попытке обновить текстовые представления - PullRequest
0 голосов
/ 16 июня 2011

Хорошо, что приложение должно делать:

  1. отображает кнопку запуска,
  2. при нажатии запускаются две службы, и кнопка запуска (просмотр) меняется накнопка остановки,
  3. при нажатии кнопки остановки код должен снова изменить представление, чтобы отобразить все результаты

что происходит в данный момент, когда код выполняет всевплоть до самого последнего вызова метода (update (); который отмечен в коде) и logcat сообщает об исключении nullPointerException в строке 146, которое я отметил в коде.

ВАЖНО ЗАМЕТЬТЕ!

  1. Если я уберу "update ();"вызов метода код выполняется отлично и отображает значения, заданные для текстовых представлений в самом xml.только когда я пытаюсь обновить текстовые представления, это терпит крах.Я попытался поместить их в другие места в файле, но у меня все еще появляется та же ошибка,Я разместил файл макета XML, к которому он обращается.Ошибка, которая у меня была вчера, заключалась в том, что в файле макета не было определения для одной из кнопок (которые я сейчас удалил).

    Вот мой основной класс.

        public class GPSMain extends Activity   {
    
        protected PowerManager powerManager;
        protected PowerManager.WakeLock wL;
    
        //text views to display latitude, longitude, speed and G force values
        static TextView latituteField, longitudeField, kmphSpeedField, avgKmphField, topKmphField, accText, totalDistance;
    
        //objects to store information for  GPS locations and current, top, total and average speed
        protected static double lat = 0, lon = 0, kmphSpeed = 0, avgKmph = 0, totalKmph = 0, topKmph = 0;
    
        protected static float distanceBetweenPoints = 0.0f;
    
        protected static Location previousLocation;
    
        //accelerometer values
        static String a = "x", b = "y", c = "z";
    
        //context for Toast views
        private Context context;
    
        //The stop and start button
        static Button button;
    
        //switch to alternate between stop and start features
        private int buttonSwitch = 2;
    
        static int counter = 0;
    
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start);
    
        context = this;
    
        //gives the button the start value
        button = (Button) findViewById(R.id.startbutton);
    
        //calls the method to the initial button listener
        switchButton();
    
        //sets up the text views to display results
        latituteField = (TextView) findViewById(R.id.lat);
        longitudeField = (TextView) findViewById(R.id.lon); 
        totalDistance = (TextView) findViewById(R.id.totaldistance);
        kmphSpeedField = (TextView) findViewById(R.id.kmph);
        avgKmphField = (TextView) findViewById(R.id.avgkmph);
        topKmphField = (TextView) findViewById(R.id.topkmph);
        accText = (TextView) findViewById(R.id.acctext);
    
    
    
    
        }
    
        //defines the button functions
        void switchButton(){
    
        button.setOnClickListener(new View.OnClickListener() {
    
            public void onClick(View v) {
    
                if(buttonSwitch%2==0){
    
                    buttonSwitch++;
                    startService();
                }
    
                else
    
                {
    
                    buttonSwitch++;
                    stopService();
                    update();            //update method call
    
                }
    
            }
    
        });
    
        }
    
        //rounds the float values from the accelerometer
        static String roundTwoDecimalFloat(float a){
    
        String formattedNum;
        NumberFormat nf = new DecimalFormat();
        nf.setMaximumFractionDigits(2);
        nf.setMinimumFractionDigits(2);
        formattedNum = nf.format(a);
        return formattedNum;
        }
    
        //starts the 2 services and changes the button from a start button to a stop button
        void startService(){
    
        setContentView(R.layout.stop);
        GPSMain.button = (Button) findViewById(R.id.stopbutton);
        switchButton();
    
        Toast.makeText(context, "Accessing Accelerometer", Toast.LENGTH_LONG).show();
        startService(new Intent(this, AccelerometerReader.class));
    
        Toast.makeText(context, "Acquiring GPS Locations", Toast.LENGTH_LONG).show();
        startService(new Intent(this, Calculations.class));
    
        }
    
        //stops the two services
        void stopService(){
    
        setContentView(R.layout.results);
    
        Toast.makeText(context, "Terminating Accelerometer", Toast.LENGTH_LONG).show();
        AccelerometerReader.myManager.unregisterListener(AccelerometerReader.mySensorListener);
        stopService(new Intent(this, AccelerometerReader.class));
    
        Toast.makeText(context, "Terminating Connection", Toast.LENGTH_LONG).show();
        Calculations.locationManager.removeUpdates(Calculations.locationListener);
        stopService(new Intent(this, Calculations.class));
    
        }
    
        //prints the results to the screen
        static void update(){
    
    146 latituteField.setText("Current Latitude: "+String.valueOf(lat));
        longitudeField.setText("Current Longitude: "+String.valueOf(lon));
        totalDistance.setText("Total Distance: "+String.valueOf(distanceBetweenPoints/1000));
        kmphSpeedField.setText("Cuttent Speed (kmph): "+String.valueOf(kmphSpeed));
        avgKmphField.setText("Average Speed (kmph): "+String.valueOf(avgKmph));
        topKmphField.setText("Top Speed (kmph): "+String.valueOf(topKmph));
        accText.setText("Accelerometer Values: "+" x: " + a + " y: " + b + " z: " + c);
    
        }
    
        }
    

    Вот XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/linearlayout1"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
    <TextView  
        android:id="@+id/hello"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    <TextView  
        android:id="@+id/lat"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Current Latitude:     unknown"
        />
    <TextView  
        android:id="@+id/lon"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Current Longitude:        unknown"
        />
    <TextView
        android:id="@+id/totaldistance"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Total Distance (km):      unknown"
        />
    <TextView
        android:id="@+id/kmph"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Current Speed (kmph):     unknown"
        />
    <TextView
        android:id="@+id/avgkmph"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Average Speed (kmph):     unknown"
        />
    <TextView
        android:id="@+id/topkmph"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Top Speed (kmph):     unknown"
        />   
    <TextView
        android:id="@+id/acctext"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Accelerometer Values:     unknown"
        />
    </LinearLayout>
    

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Проблема в том, что вы вызываете метод switchButton() перед инициализацией TextView, т.е. latituteField = (TextView) findViewById(R.id.lat);, из-за этого вы получили исключение нулевого указателя. поэтому сначала запишите инициализацию всех элементов представления после этого вызова switchButton(). Я изменил ваш код. Попробуйте ввести следующий код

Используйте следующий код для метода onCreate

@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.start);

        context = this;

        // gives the button the start value
        button = (Button) findViewById(R.id.startbutton);

        // calls the method to the initial button listener


        // sets up the text views to display results
        latituteField = (TextView) findViewById(R.id.lat);
        longitudeField = (TextView) findViewById(R.id.lon);
        totalDistance = (TextView) findViewById(R.id.totaldistance);
        kmphSpeedField = (TextView) findViewById(R.id.kmph);
        avgKmphField = (TextView) findViewById(R.id.avgkmph);
        topKmphField = (TextView) findViewById(R.id.topkmph);
        accText = (TextView) findViewById(R.id.acctext);

        switchButton();

    }
0 голосов
/ 16 июня 2011

Когда вы вызываете setContentView (), ваши ссылки на любые ранее созданные представления больше не действительны.

В onCreate () вы устанавливаетеContentView (R.layout.results), а затем устанавливаете latitudeField (и другиессылки), что, если они не возвращаются ноль, это хорошо.(Вы не упомянули , для какого макета вы предоставили xml).

Затем вы устанавливаете прослушиватель кнопок, который вызывает либо startService (), либо stopService (), каждый из которых устанавливает новыйпросмотр содержимого, ни один из которых не обновляет ссылки на просмотр;все приоры недействительны на данный момент.Затем вы вызываете update (), который пытается использовать недопустимую ссылку.

Либо обновляйте свои ссылки, когда вы меняете представления, либо извлекайте их в тот момент, когда они необходимы.

0 голосов
/ 16 июня 2011

в метод обновления попробуйте использовать txt=(TextView)findviewbyId(R.id.yourtextid);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...