Приложение вылетает .. нашел объяснение с логарифмом, но не знаю, почему

Код:

        package com.example.theball;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
@SuppressLint("NewApi") public class MainActivity extends Activity implements SensorEventListener {
        private SensorManager sensorManager;
        private Sensor accelerometer;
        @SuppressWarnings("unused")
        private long lastUpdate;
        AnimatedView animatedView = null;
        ShapeDrawable mDrawable = new ShapeDrawable();
        public static int x;
        public static int y;
        public static final int width = 50;
        public static final int height = 50;
        public boolean firstDraw = true;
        private int screen_width; 
        private int screen_height; 
        private int sensorX;
        private Timer t;
        private int TimeCounter = 0;
        private int sensorY;
        private int score = 0;
        @Override        
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            accelerometer = sensorManager
                    .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            lastUpdate = System.currentTimeMillis();
            animatedView = new AnimatedView(this);
            setContentView(animatedView);
            t=new Timer();
            t.scheduleAtFixedRate(new TimerTask() {
                public void run() {
                    runOnUiThread(new Runnable() {
                        public void run() {                 
                            TimeCounter++;      
                        }
                       });
                    }
            }, 0, 1000); 
        }
            public static class MainActivity extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
          View v = inflater.inflate(R.layout.activity_main, container, false);
          TextView highscore_int = (TextView)v.findViewById(R.id.highscore_int );
           SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", 
            Context.MODE_PRIVATE);
           score = prefs.getInt("key", 0);
          highscore_int.setText("Highscore:" + score +" seconds."); 
          return v;
    }
        @Override
        protected void onResume() {

            super.onResume();
            sensorManager.registerListener(this, accelerometer,
                    SensorManager.SENSOR_DELAY_GAME);
        }
        @Override
        protected void onPause() {
            super.onPause();
            sensorManager.unregisterListener(this);
        }
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                sensorY = (int) event.values[1];
                sensorX = (int) event.values[0];
                x -= sensorX*3;
                y += sensorY*3;
                if(x <= 0 || x >= screen_width || y <= 0 || y >= screen_height) { 
                    SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
                     int oldScore = prefs.getInt("key", 0);  
                     if( TimeCounter > oldScore ){
                        Editor edit = prefs.edit();
                        edit.putInt("key", TimeCounter);
                        edit.commit(); }
                    Intent myIntent = new Intent(this, YouLost.class);
                    startActivity(myIntent);
            }
        }
        }
        public class AnimatedView extends ImageView { 

            Display display = getWindowManager().getDefaultDisplay(); 
            Point size = new Point(); 
            static final int width = 50; 
            static final int height = 50; 
            @SuppressLint("NewApi") 
            public AnimatedView(Context context) { 
            super(context); 
            // TODO Auto-generated constructor stub 
            display.getSize(size); 
            screen_width = size.x; 
            screen_height = size.y; 
            mDrawable = new ShapeDrawable(new OvalShape()); 
            mDrawable.getPaint().setColor(0xffffAC23); 
            mDrawable.setBounds(0, 0, screen_width, screen_height); 
            }
            @Override 
            protected void onDraw(Canvas canvas) { 
            mDrawable.setBounds(x, y, x + width, y + height); 
            if(firstDraw) { 
            x = screen_width / 2; 
            y = screen_height / 2; 
            firstDraw = false; 
            } 
            mDrawable.draw(canvas); 
            invalidate(); 
            } 
            }
}

Моя новая проблема заключается в том, что в графическом макете Eclipse я вижу текст, а на своем устройстве - нет.

Я не знаю, почему это происходит, во всяком случае, мой текст черный, а фон белый, так что это не проблема.


person DavidBalas    schedule 07.07.2014    source источник
comment
Вы можете также вставить свой файл макета? кажется, что ваш textView имеет значение null..   -  person OferM    schedule 07.07.2014
comment
проверьте строку MainActivity № 76. Значение null получает пропуск.   -  person rupesh    schedule 07.07.2014
comment
покажите свой полный код onCreate()   -  person PKlumpp    schedule 07.07.2014
comment
это аккуратное представление, можете ли вы опубликовать xml и его имя, убедитесь, что setContentView в onCreate ссылается на одно и то же   -  person Pararth    schedule 07.07.2014
comment
вставьте строку номер 76 вашего основного действия.   -  person Pankaj Arora    schedule 07.07.2014
comment
@OferM Добавил файл xml, если нужно, я добавлю еще. И да, мой setContentView такой же: setContentView(R.layout.fragment_main);   -  person DavidBalas    schedule 07.07.2014
comment
@ user2450263 См. комментарий.   -  person DavidBalas    schedule 07.07.2014
comment
@DevCarlsberg Строка есть -_- она ​​также находится после кода.   -  person DavidBalas    schedule 07.07.2014
comment
пожалуйста, предоставьте полный метод onCreate.   -  person jithinroy    schedule 07.07.2014
comment
поскольку вы используете фрагмент, я думаю, это может вам помочь. findViewById возвращает NULL при использовании фрагмента   -  person EricHua23    schedule 07.07.2014
comment
проверьте как onCreate(), так и onCreateView() , если вы раздуваете fragment_main в последнем, вам нужно сместить rootview.findViewById в onCreateView, прежде чем вы вернете rootview   -  person Pararth    schedule 07.07.2014
comment
stackoverflow.com/questions/23653778/   -  person laalto    schedule 07.07.2014


Ответы (3)


textview highscore_int имеет значение null, потому что вы ссылаетесь на highscore_int из fragment_main.xml, вы получите null, потому что в своей деятельности вы используете activity's layout

Поэтому используйте highscore_int в onCreateView вашего фрагмента, чтобы раздуть представление

View v = inflater.inflate(R.layout.fragment_main, container, false);

затем используйте представление, чтобы найти текстовое представление

TextView highscore_int = (TextView)v.findViewById(R.id.highscore_int );

i.e.

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
          View v = inflater.inflate(R.layout.fragment_main, container, false);
          TextView highscore_int = (TextView)v.findViewById(R.id.highscore_int );
           SharedPreferences prefs = getActivity().getSharedPreferences("myPrefsKey", 
            Context.MODE_PRIVATE);
           score = prefs.getInt("key", 0);
          highscore_int.setText("Highscore:" + score +" seconds."); 
          return v;
    }
person Giru Bhai    schedule 07.07.2014
comment
Он очищает ошибку, но все еще не отвечает из-за другой вещи :( - person DavidBalas; 07.07.2014
comment
@user3784668 user3784668 Опубликуйте новый вопрос с новой проблемой, и если существующая проблема решена, примите ответ. - person Giru Bhai; 07.07.2014
comment
Да, спасибо :) полтора часа до следующего вопроса :( - person DavidBalas; 07.07.2014
comment
Эмм, у меня теперь другая проблема... в моем графическом макете Eclipse я вижу текстовое представление, но не вижу его на своем устройстве... Я ввел текст как 12312312, но на моем устройстве вы ничего не увидите. - person DavidBalas; 07.07.2014
comment
@user3784668 user3784668 отредактируйте свой вопрос с помощью метода oncreate. - person Giru Bhai; 07.07.2014
comment
@user3784668 user3784668 реализовать метод onCreateView в вашем классе фрагментов и переопределить его, как я предлагаю. - person Giru Bhai; 07.07.2014
comment
@user3784668 user3784668 хммм..... onCreateView - это метод класса фрагмента, поэтому реализуйте код инициализации текстового представления во фрагменте, а не в активности. - person Giru Bhai; 07.07.2014
comment
Ну ничего, я думаю это не твоя проблема.. Открою новую тему. - person DavidBalas; 07.07.2014

потому что prefs.getInt("key", 0); возвращает ноль и сохраняется в счете

Используйте это

score = 0;
if(prefs.getInt("key", 0) != null){
   score = prefs.getInt("key", 0);
}
person user3811952    schedule 07.07.2014
comment
Извините, но это не работает, строка 'if(prefs.getInt(key, 0) != null){' получает ошибку, но предложений нет - person DavidBalas; 07.07.2014

Моя догадка основана на слове fragment_main.xml. Я предполагаю, что код, который вы вставили, взят из вашей деятельности, а макет основан на вашем фрагменте. Это означает, что вы можете вызывать findViewById() только в своем классе фрагментов.

Переопределите метод фрагмента onCreateView() и получите там Highscore TextView. Туда же переместите код:

//onCreateView() of your fragment
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, null);
    highscore_int = (TextView) view.findViewById(R.id.highscore_int);

    SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
    score = prefs.getInt("key", 0);
    highscore_int.setText("Highscore:" + score +" seconds.");

    // You lost
    SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
    int oldScore = prefs.getInt("key", 0);  
    if( TimeCounter > oldScore ) {
        Editor edit = prefs.edit();
        edit.putInt("key", TimeCounter);
        edit.commit();
    }
}
person WarrenFaith    schedule 07.07.2014
comment
mView не может быть преобразован в переменную, кроме того, он просит меня удалить переопределение. - person DavidBalas; 07.07.2014
comment
Извините, mView был из кода, который я скопировал. Я отредактирую код. Для Override: вы можете проверить, есть ли он у вас в вашем классе Fragment и что ваш уровень Java равен 6, иначе вы получите это сообщение (которое основано на Java 4 afaik). - person WarrenFaith; 07.07.2014