Вылетает при создании intent

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Вылетает при создании intent

Сообщение plastex » 10 авг 2013, 16:32

Всего лишь пару дней назад начал писать свое приложение, в итоге столкнулся с проблемой. Была взята заготовка боковой навигации с http://habrahabr.ru/post/158453/, впилена кнопка ее реализации в экшн бар. После этого захотел, чтобы при клике по пункту боковой навигации запускалось новое активити. Но приложение вылетает. Если же из кода убрать объяявление самого интента, то приложение работает.

Выкладываю содержимое проблемного ява-файла. Склоняюсь к проблеме, что класс наследуется от FragmentActivity,а не обычного Activity и отсюда по идее следует, что в качестве первого аргумента интента должно быть не this ( :cry: ) , но это догадки. буду благодарен за помощь.

Код: Выделить всё


import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Scroller;

public class MainActivity extends FragmentActivity implements SideMenuListener {
	
	Intent intent = new Intent(this,DictActivity.class);
    
    private String[] names = { "Словарь", "Марья", "Петр", "Антон", "Даша", "Борис",  "Костя", "Игорь",
            "Анна", "Денис", "Андрей", "Иван", "Марья", "Петр", "Антон", "Даша" };

    private FragmentTransaction fragmentTransaction; 
    private View content;
    private int contentID = R.id.content;
    
    private final double RIGTH_BOUND_COFF = 0.75;
    private static int DURATION = 250;
    private boolean isContentShow = true;
    private int rightBound;
    private ContentScrollController menuController;
    private Rect contentHitRect = new Rect();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        content = findViewById(contentID);
        menuController = new ContentScrollController(new Scroller(getApplicationContext(), new DecelerateInterpolator(3)));
        
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        rightBound = (int) (displaymetrics.widthPixels * RIGTH_BOUND_COFF);
        
        
        content.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                v.getHitRect(contentHitRect);
                contentHitRect.offset(-v.getScrollX(), v.getScrollY());
                if (contentHitRect.contains((int)event.getX(), (int)event.getY())) return true; 
                return v.onTouchEvent(event);
            }
        });
        
        
        
        
        ListView menu = (ListView) findViewById(R.id.menu);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        		android.R.layout.simple_list_item_1, names);
        menu.setAdapter(adapter);
        
        
        
        menu.setOnItemClickListener(new OnItemClickListener() {
         

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
			          int position, long id) {
				if (position==0)
				{
					
				//      startActivity(intent);
				}
				}
				// TODO Auto-generated method stub
				
			});
    }
    
    

    public void startFragment(Fragment fragment) {
        fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(contentID, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

    public boolean toggleMenu() {
        if(isContentShow)
            menuController.openMenu(DURATION);
        else
            menuController.closeMenu(DURATION);
        return isContentShow;	
    }
    
    
    
    
    private class ContentScrollController implements Runnable {
        private final Scroller scroller;
        private int lastX = 0;

        public ContentScrollController(Scroller scroller) {
        	this.scroller = scroller;
        }
        
        
        public void run() {
              if (scroller.isFinished())
            	  return;

              final boolean more = scroller.computeScrollOffset();
              final int x = scroller.getCurrX();
              final int diff = lastX - x;

              if (diff != 0) {
            	  content.scrollBy(diff, 0);
            	  lastX = x;
              }
              if (more)
            	  content.post(this);
        }
        

        public void openMenu(int duration) {
        	isContentShow = false;
        	final int startX = content.getScrollX();
        	final int dx = rightBound + startX;
        	fling(startX, dx, duration);
        }
        
        public void closeMenu(int duration) {
        	isContentShow = true;
        	final int startX = content.getScrollX();
        	final int dx = startX;
        	fling(startX, dx, duration);
        }
        
        private void fling(int startX, int dx, int duration) {
        	if (!scroller.isFinished())
        		scroller.forceFinished(true);
        	if (dx == 0)
        		return;
        	if (duration <= 0) {
        		content.scrollBy(-dx, 0);
        		return;
        	}
        	scroller.startScroll(startX, 0, dx, 0, duration);
        	lastX = startX;
        	content.post(this);
        } 
    }
    
}

Критует при добавлении строки

Код: Выделить всё

 Intent intent = new Intent(this,DictActivity.class);
Последний раз редактировалось plastex 12 авг 2013, 19:01, всего редактировалось 1 раз.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вылетает при создании intent

Сообщение rezak90 » 11 авг 2013, 16:56

plastex писал(а):Склоняюсь к проблеме, что класс наследуется от FragmentActivity,а не обычного Activity и отсюда по идее следует, что в качестве первого аргумента интента должно быть не this
FragmentActivity наследник от Activity, так что это суждение не верно.
Вообще выкладывайте лог ошибок. Но вангую что TestFragment это фрагмент, а интентом стартуются только активити.
R.id.team
Политика на форуме запрещена

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Вылетает при создании intent

Сообщение plastex » 12 авг 2013, 19:36

rezak90 писал(а):
plastex писал(а):Склоняюсь к проблеме, что класс наследуется от FragmentActivity,а не обычного Activity и отсюда по идее следует, что в качестве первого аргумента интента должно быть не this
FragmentActivity наследник от Activity, так что это суждение не верно.
Вообще выкладывайте лог ошибок. Но вангую что TestFragment это фрагмент, а интентом стартуются только активити.
В коде,кстати, интент был немного неправильный. На случай теста была замена DictActivity.class на TestFragment.class. Сверху исправил код.
Так что интент вызывает активити. Да что вызывает, я специально закомментарил вызов активити, она вылетает еще на создании интента.

Код: Выделить всё

08-12 16:34:08.478: ERROR/AndroidRuntime(924): FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.easyenglish/com.easyenglish.MainActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
        at android.app.ActivityThread.access$600(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.NullPointerException
        at android.content.ComponentName.<init>(ComponentName.java:75)
        at android.content.Intent.<init>(Intent.java:3491)
        at com.easyenglish.MainActivity.<init>(MainActivity.java:23)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1319)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
        ... 11 more
это мне выдал логкат intellij idea 12.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Вылетает при создании intent

Сообщение rezak90 » 12 авг 2013, 20:46

Потому что нужно Java учить. Поля класса инициализируются перед созданием активити, и соответственно ссылка this на MainActivity в момент new Intent(this,DictActivity.class); будет передавать null из-за чего и выпадает java.lang.NullPointerException
R.id.team
Политика на форуме запрещена

plastex
Сообщения: 10
Зарегистрирован: 12 июл 2013, 00:38

Re: Вылетает при создании intent

Сообщение plastex » 12 авг 2013, 22:13

Спасибо, дальше сам сообразил)

missing
Сообщения: 2
Зарегистрирован: 15 янв 2014, 18:49

Re: Вылетает при создании intent

Сообщение missing » 15 янв 2014, 19:03

У меня похожая проблема, но не пойму как вы ее решили, хотя может и ошибка совсем в другом.
метод ResultAsync вызывается после выполнения AsyncTask ,вот он:

Код: Выделить всё

public void ResultAsync(Boolean result){
		txtOut.setText(String.valueOf(result));
		Intent GoToMain= new Intent (this, Copy.class);
		startActivity(GoToMain);
	}
в txtOut нормально выводится запись. если закомментировать создание Намерение - то приложение отработает отлично. Так же если Copy сделать стартовой, то оно запуститься без проблем. но при переходе от Намерения вылетатет.
вот пример файла манифеста

Код: Выделить всё

<application
        android:allowBackup="true"
        android:icon="@drawable/app_mag"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
         android:debuggable="true" >
        <activity android:name="LoginActivity"><intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter></activity>
        <activity android:name="MainActivity"></activity>
        <activity android:name="Copy"></activity>
    </application>
вот что пишет LogCat

Код: Выделить всё

01-12 20:08:18.730: E/AndroidRuntime(5568): FATAL EXCEPTION: main
01-12 20:08:18.730: E/AndroidRuntime(5568): java.lang.NullPointerException
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.content.ComponentName.<init>(ComponentName.java:75)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.content.Intent.<init>(Intent.java:3122)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at com.example.notmyself.LoginActivity.ResultAsync(LoginActivity.java:81)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at com.example.notmyself.AscTaskLogin.onPostExecute(AscTaskLogin.java:24)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at com.example.notmyself.AscTaskLogin.onPostExecute(AscTaskLogin.java:1)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.os.AsyncTask.finish(AsyncTask.java:602)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.os.AsyncTask.access$600(AsyncTask.java:156)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.os.Looper.loop(Looper.java:137)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at java.lang.reflect.Method.invoke(Method.java:511)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-12 20:08:18.730: E/AndroidRuntime(5568): 	at dalvik.system.NativeStart.main(Native Method)
в чем причина?

Ответить