Помогите найти ошибку в коде.

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 15 янв 2012, 18:15

Ошибка кроется в строке

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

contact.getLayoutParams().width = LayoutParams.FILL_PARENT;
но только не пойму почему. Суть класса - сделать небольшую базу данных, которая может создавать контакты и выводить их на другой Activity в таком же виде, как и в 41 уроке http://startandroid.ru/uroki/vse-uroki- ... piska.html. Что я делаю не так? Судя по логу с ошибками я так понимаю что ошибка из-за того, что объект второго Activity просто еще не создан, его нету. Отсюда и java.lang.NullPointerException. Всё верно?

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

public class EditContactDBActivity extends Activity implements OnClickListener  {

	
	private static final String TABLE_NAME = "phonebook";
	private static final String KEY_ID = "_id";
	private static final String KEY_JOB = "job";
	private static final String KEY_NAME = "name";
	private static final String KEY_PHONE = "phone";
	private static final String KEY_EMAIL = "email";
	
	String id, job, name, phone, email;
	int[] colors = new int[2];
	
	EditText etId, etJob, etName, etPhone, etEmail;
	Button btnAddContact, btnDelContact, 
		   btnClearContacts, btnOpenContacts, btnUpdContact;
	DBHelper dbHelper;
    ContentValues cv = new ContentValues();
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnAddContact = (Button) findViewById(R.id.btnAddContact);
        btnAddContact.setOnClickListener(this);
        
        btnDelContact = (Button) findViewById(R.id.btnDelContact);
        btnDelContact.setOnClickListener(this);
        
        btnUpdContact = (Button) findViewById(R.id.btnUpdContact);
        btnUpdContact.setOnClickListener(this);
        
        btnClearContacts = (Button) findViewById(R.id.btnClearContacts);
        btnClearContacts.setOnClickListener(this);
        
        btnOpenContacts = (Button) findViewById(R.id.btnOpenContacts);
        btnOpenContacts.setOnClickListener(this);
        
        etId = (EditText) findViewById(R.id.etId);
        etJob = (EditText) findViewById(R.id.etJob);
        etName = (EditText) findViewById(R.id.etName);
        etPhone = (EditText) findViewById(R.id.etPhone);
        etEmail = (EditText) findViewById(R.id.etEmail);
        
        dbHelper = new DBHelper(this);
        colors[0] = Color.parseColor("#559966CC");
        colors[1] = Color.parseColor("#55336699");
    }
    
    @Override
    public void onClick(View v) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        putData();
        switch (v.getId()) {
        
        case R.id.btnAddContact:
        	db.insert(TABLE_NAME, null, cv);
        	break;
        	
        case R.id.btnUpdContact:
            if (id.equalsIgnoreCase("")) {
              break;
            }
            db.update(TABLE_NAME, cv, "_id = ?",new String[] { id });
            break;
        
        case R.id.btnDelContact:
            if (id.equalsIgnoreCase("")) {
              break;
            }
            db.delete(TABLE_NAME, "_id = " + id, null);
            break;
        
        case R.id.btnOpenContacts:
	        Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
	        if (cursor.moveToFirst()) {
	        int idColIndex = cursor.getColumnIndex(KEY_ID);
	        int jobColIndex = cursor.getColumnIndex(KEY_JOB);
	        int nameColIndex = cursor.getColumnIndex(KEY_NAME);
	        int phoneColIndex = cursor.getColumnIndex(KEY_PHONE);
	        int emailColIndex = cursor.getColumnIndex(KEY_EMAIL);
	        LinearLayout layoutContactList = (LinearLayout) findViewById(R.id.layoutContactList);
	        LayoutInflater ltInflater = getLayoutInflater();
	        int i=0;
		    Intent intent = new Intent(this, ContactListActivity.class);
	        while (cursor.moveToNext()) {
	            View contact = ltInflater.inflate(R.layout.contact, layoutContactList, false);
//	            TextView tvId = (TextView) contact.findViewById(R.id.tvId);
//	            tvId.setText(cursor.getInt(idColIndex));
	            TextView tvJob = (TextView) contact.findViewById(R.id.tvJob);
	            tvJob.setText(cursor.getString(jobColIndex));
	            TextView tvName = (TextView) contact.findViewById(R.id.tvName);
	            tvName.setText(cursor.getString(nameColIndex));
	            TextView tvPhone = (TextView) contact.findViewById(R.id.tvPhone);
	            tvPhone.setText(cursor.getString(phoneColIndex));
	            TextView tvEmail = (TextView) contact.findViewById(R.id.tvEmail);
	            tvEmail.setText(cursor.getString(emailColIndex));
	            Log.d("myLogs", "1");
	            contact.getLayoutParams().width = LayoutParams.FILL_PARENT;
	            Log.d("myLogs", "2");
	            contact.setBackgroundColor(colors[i % 2]);
	            layoutContactList.addView(contact);
	            i++;
	        }
		    startActivity(intent);
	        break;
	    }
        case R.id.btnClearContacts:
	        db.delete(TABLE_NAME, null, null);
	        break;
        }
        dbHelper.close();
    }
    
    private ContentValues putData() {
          id = etId.getText().toString();
          job = etJob.getText().toString();
          name = etName.getText().toString();
          phone = etPhone.getText().toString();
          email = etEmail.getText().toString();
          
    	  cv.put(KEY_JOB, name);
          cv.put(KEY_NAME, name);
          cv.put(KEY_PHONE, name);
          cv.put(KEY_EMAIL, email);
          return cv;
    }
    
}


class DBHelper extends SQLiteOpenHelper {

	private static final int DB_VERSION = 1;	
	private static final String DB_NAME = "firstDB";
	
	public DBHelper(Context context) {
      super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    	db.execSQL("create table phonebook ("
	        + "_id integer primary key autoincrement,"
	        + "job text,"
	        + "name text,"
	        + "phone text,"
	        + "email text" + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }
01-15 15:10:51.732: W/KeyCharacterMap(546): No keyboard for id 0
01-15 15:10:51.742: W/KeyCharacterMap(546): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-15 15:10:58.862: D/myLogs(546): 1
01-15 15:10:58.872: D/AndroidRuntime(546): Shutting down VM
01-15 15:10:58.882: W/dalvikvm(546): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
01-15 15:10:58.882: E/AndroidRuntime(546): Uncaught handler: thread main exiting due to uncaught exception
01-15 15:10:58.912: E/AndroidRuntime(546): java.lang.NullPointerException
01-15 15:10:58.912: E/AndroidRuntime(546): at my.contacts.EditContactDBActivity.onClick(EditContactDBActivity.java:121)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.View.performClick(View.java:2364)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.View.onTouchEvent(View.java:4179)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.widget.TextView.onTouchEvent(TextView.java:6540)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.View.dispatchTouchEvent(View.java:3709)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
01-15 15:10:58.912: E/AndroidRuntime(546): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
01-15 15:10:58.912: E/AndroidRuntime(546): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
01-15 15:10:58.912: E/AndroidRuntime(546): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.os.Looper.loop(Looper.java:123)
01-15 15:10:58.912: E/AndroidRuntime(546): at android.app.ActivityThread.main(ActivityThread.java:4363)
01-15 15:10:58.912: E/AndroidRuntime(546): at java.lang.reflect.Method.invokeNative(Native Method)
01-15 15:10:58.912: E/AndroidRuntime(546): at java.lang.reflect.Method.invoke(Method.java:521)
01-15 15:10:58.912: E/AndroidRuntime(546): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-15 15:10:58.912: E/AndroidRuntime(546): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-15 15:10:58.912: E/AndroidRuntime(546): at dalvik.system.NativeStart.main(Native Method)
01-15 15:10:58.943: I/dalvikvm(546): threadid=7: reacting to signal 3
01-15 15:10:58.975: I/dalvikvm(546): Wrote stack trace to '/data/anr/traces.txt'
01-15 15:11:00.933: I/Process(546): Sending signal. PID: 546 SIG: 9

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 15 янв 2012, 19:43

Поменял немного цикл while

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

while (cursor.isLast()) {
	            View contact = ltInflater.inflate(R.layout.contact, layoutContactList, false);
		        contact.setLayoutParams(new LayoutParams(
        		LayoutParams.FILL_PARENT,
        		LayoutParams.WRAP_CONTENT));
//	            TextView tvId = (TextView) contact.findViewById(R.id.tvId);
//	            tvId.setText(cursor.getInt(idColIndex));
	            TextView tvJob = (TextView) contact.findViewById(R.id.tvJob);
	            tvJob.setText(cursor.getString(jobColIndex));
	            TextView tvName = (TextView) contact.findViewById(R.id.tvName);
	            tvName.setText(cursor.getString(nameColIndex));
	            TextView tvPhone = (TextView) contact.findViewById(R.id.tvPhone);
	            tvPhone.setText(cursor.getString(phoneColIndex));
	            TextView tvEmail = (TextView) contact.findViewById(R.id.tvEmail);
	            tvEmail.setText(cursor.getString(emailColIndex));
	            contact.getLayoutParams().width = LayoutParams.FILL_PARENT;
	            contact.setBackgroundColor(colors[i % 2]);
	            layoutContactList.addView(contact);
	            cursor.moveToNext();
	            i++;
	        }
Теперь ругается с той же ошибкой (java.lang.NullPointerException) на строку

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

layoutContactList.addView(contact);
Но с чего бы вдруг?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 15 янв 2012, 23:21

Т.е. R.id.layoutContactList - это объект на втором Activity и вы пытаетесь его наполнить с первого?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 15 янв 2012, 23:54

Да, вот именно я пытаюсь второй Activity наполнить с первого и после его вызвать. Или это невозможно? Если нет, то как отобразить базу с данными во втором Activity, когда с базой мы работаем в первом?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 16 янв 2012, 09:20

Метод findViewById, который вы вызываете, ищет компоненты на текущей Activity. Он не найдет компоненты с другой и поэтому возвращает null.

Создайте отдельный класс по работе с БД, а не вложенный в EditContactDBActivity. Тогда вы сможете обращаться к нему из любой точки приложения и в другом Activity используете для наполнения экрана.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 16 янв 2012, 10:24

Ясно, спасибо, сейчас попробую.
Одно не понятно. Файл с id элементами один на все Activity. Так почему он не может найти по id элемент? Даже из названия видно что через id, а не Activity.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 16 янв 2012, 11:38

no-- писал(а):Файл с id элементами один на все Activity. Так почему он не может найти по id элемент? Даже из названия видно что через id, а не Activity.
ID сквозные, но каждая Activity ищет только у себя элементы.
У вас в R.layout.main есть элемент c ID = R.id.layoutContactList?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 16 янв 2012, 19:58

Нету. Блин, уже замучался. Сейчас что я делаю не так? Вынес в отдельный класс все что связано с базой данных. Получилось так: первый класс с главным Activity обрабатывает нажатие кнопок, создает объект с классом базы данных, после чего анализирует нажатую клавишу и вызывает соответствующий метод. Приведу немного кода.
Главный Activity

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

public class EditContactDBActivity extends Activity implements OnClickListener  {
	
	String id, job, name, phone, email;
	DataBase db;
	EditText etId, etJob, etName, etPhone, etEmail;
	Button btnAddContact, btnDelContact, 
		   btnClearContacts, btnOpenContacts, btnUpdContact;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnAddContact = (Button) findViewById(R.id.btnAddContact);
        btnAddContact.setOnClickListener(this);
        
        btnDelContact = (Button) findViewById(R.id.btnDelContact);
        btnDelContact.setOnClickListener(this);
        
        btnUpdContact = (Button) findViewById(R.id.btnUpdContact);
        btnUpdContact.setOnClickListener(this);
        
        btnClearContacts = (Button) findViewById(R.id.btnClearContacts);
        btnClearContacts.setOnClickListener(this);
        
        btnOpenContacts = (Button) findViewById(R.id.btnOpenContacts);
        btnOpenContacts.setOnClickListener(this);
        
        etId = (EditText) findViewById(R.id.etId);
        etJob = (EditText) findViewById(R.id.etJob);
        etName = (EditText) findViewById(R.id.etName);
        etPhone = (EditText) findViewById(R.id.etPhone);
        etEmail = (EditText) findViewById(R.id.etEmail);
        
        db = new DataBase();
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnAddContact:
        	db.addContact();
        	break;
        case R.id.btnUpdContact:
            if (id.equalsIgnoreCase("")) {
            	break;
            }
            db.UpdateContact();
            break;
        case R.id.btnDelContact:
            if (id.equalsIgnoreCase("")) {
            	break;
            }
            db.deleteContact();
            break;
        
        case R.id.btnOpenContacts:
	        db.openContacts();
	        break;
        case R.id.btnClearContacts:
	        db.clearContacts();
	        break;
        }
    }
    
}
отдельный файл с 2-мя классами для работы с базой данных.

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

public class DataBase extends Activity {

	
	private static final String TABLE_NAME = "phonebook";
	private static final String KEY_ID = "_id";
	private static final String KEY_JOB = "job";
	private static final String KEY_NAME = "name";
	private static final String KEY_PHONE = "phone";
	private static final String KEY_EMAIL = "email";
	
	String id, job, name, phone, email;
	int[] colors;
	EditText etId, etJob, etName, etPhone, etEmail;
	DBHelper dbHelper;
    ContentValues cv;
    SQLiteDatabase db;
	
    DataBase() { 
    	cv = new ContentValues();
    	dbHelper = new DBHelper(this); 
    	colors =  new int[2];
        etId = (EditText) findViewById(R.id.etId);
        etJob = (EditText) findViewById(R.id.etJob);
        etName = (EditText) findViewById(R.id.etName);
        etPhone = (EditText) findViewById(R.id.etPhone);
        etEmail = (EditText) findViewById(R.id.etEmail);
    }

    void addContact() {
    	
    	db = dbHelper.getWritableDatabase();
    	putData();
    	db.insert(TABLE_NAME, null, cv);
    	db.close();
    }
    
    void UpdateContact() {
    	db = dbHelper.getWritableDatabase();
    	db.update(TABLE_NAME, putData(), "_id = ?",new String[] { id });
    	db.close();
    }
    
    void deleteContact() { 
    	db = dbHelper.getWritableDatabase();
    	db.delete(TABLE_NAME, "_id = " + id, null);
    	db.close();
    }
    
    void openContacts() { 
    	db = dbHelper.getWritableDatabase();
    	Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
	        int idColIndex = cursor.getColumnIndex(KEY_ID);
	        int jobColIndex = cursor.getColumnIndex(KEY_JOB);
	        int nameColIndex = cursor.getColumnIndex(KEY_NAME);
	        int phoneColIndex = cursor.getColumnIndex(KEY_PHONE);
	        int emailColIndex = cursor.getColumnIndex(KEY_EMAIL);
	        
	        LayoutInflater ltInflater = getLayoutInflater();
	        LinearLayout layoutContactList = (LinearLayout) findViewById(R.id.layoutContactList);
	        int i=0;
		    while (cursor.moveToNext()) {
	            View contactView = ltInflater.inflate(R.layout.contact, null, false);
		        contactView.setLayoutParams(new LayoutParams(
		        						LayoutParams.FILL_PARENT,
		        						LayoutParams.WRAP_CONTENT));
	            TextView tvId = (TextView) contactView.findViewById(R.id.tvId);
	            tvId.setText(cursor.getString(idColIndex));
	            TextView tvJob = (TextView) contactView.findViewById(R.id.tvJob);
	            tvJob.setText(cursor.getString(jobColIndex));
	            TextView tvName = (TextView) contactView.findViewById(R.id.tvName);
	            tvName.setText(cursor.getString(nameColIndex));
	            TextView tvPhone = (TextView) contactView.findViewById(R.id.tvPhone);
	            tvPhone.setText(cursor.getString(phoneColIndex));
	            TextView tvEmail = (TextView) contactView.findViewById(R.id.tvEmail);
	            tvEmail.setText(cursor.getString(emailColIndex));
	            Log.d("myLogs", "1");
	            //contact.getLayoutParams().width = LayoutParams.FILL_PARENT;
	            Log.d("myLogs", "2");
	            contactView.setBackgroundColor(colors[i % 2]);
	            Log.d("myLogs", "3");
	            layoutContactList.addView(contactView,new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
	            Log.d("myLogs", "4");
	            i++;
		    }
		    db.close();
		    Intent intent = new Intent(this, ContactListActivity.class);
		    startActivity(intent);    	
        	}
    }
    
    void clearContacts() {
    	db = dbHelper.getWritableDatabase();
    	db.delete(TABLE_NAME, null, null);
    	db.close();
    }
    
    private ContentValues putData() {
          id = etId.getText().toString();
          job = etJob.getText().toString();
          name = etName.getText().toString();
          phone = etPhone.getText().toString();
          email = etEmail.getText().toString();
          
    	  cv.put(KEY_JOB, name);
          cv.put(KEY_NAME, name);
          cv.put(KEY_PHONE, name);
          cv.put(KEY_EMAIL, email);
          return cv;
    }
    
}


class DBHelper extends SQLiteOpenHelper {

	private static final int DB_VERSION = 1;	
	private static final String DB_NAME = "firstDB";
	
	public DBHelper(Context context) {
      super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    	db.execSQL("create table phonebook ("
	        + "_id integer primary key autoincrement,"
	        + "job text,"
	        + "name text,"
	        + "phone text,"
	        + "email text" + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }
В конструкторе класса базы данных я ловлю ошибки на связывании элементов TextView по id. Это раз. Ладно думаю, закомментирую пока на время. После приложение запускается, но при нажатии к примеру на clearContacts, где кода и так мало

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

    void clearContacts() {
    	db = dbHelper.getWritableDatabase();
    	db.delete(TABLE_NAME, null, null);
    	db.close();
    }
снова вылазит ошибка. Чую что просто неправильно создаю, но не пойму где. создаю объект нужного класса. Инициализирую все что нужно в конструкторе, но этого мало. Или здесь нужно через метод oncreate делать? Но он вроде для отображения нужен, а мне нечего отображать..
Сам LogCat ничего не пишет, там вообще пустота. Вот что пишет консоль

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

[2012-01-16 19:54:42 - ContactDB.apk] Uploading ContactDB.apk onto device 'emulator-5554'
[2012-01-16 19:54:42 - Device] Uploading file onto device 'emulator-5554'
[2012-01-16 19:54:44 - ddms] Created: [Debugger 8615-->580 inactive]
[2012-01-16 19:54:44 - ddm-heap] Sending REAQ
[2012-01-16 19:54:44 - ddms] Adding new client [Client pid: 580]
[2012-01-16 19:54:44 - ddms] Good handshake from client, sending HELO to 580
[2012-01-16 19:54:44 - ddm-hello] Sending HELO ID=0x4000010f
[2012-01-16 19:54:44 - ddm-heap] Sending FEAT
[2012-01-16 19:54:44 - ddm-prof] Sending MPRQ
[2012-01-16 19:54:44 - ddms] broadcast 2: [Client pid: 580]
[2012-01-16 19:54:44 - ddm-hello] Now ready: [Client pid: 580]
[2012-01-16 19:54:44 - ddm-thread] Now ready: [Client pid: 580]
[2012-01-16 19:54:44 - ddm-thread] Sending THEN: true
[2012-01-16 19:54:44 - ddms] Calling handler for TEST [com.android.ddmlib.HandleTest@718723] (len=8)
[2012-01-16 19:54:44 - ddm-test] handling TEST
[2012-01-16 19:54:44 - ddm-test] Received:
[2012-01-16 19:54:44 - ddm-test] 0000- 01 02 03 04 fc fd fe ff                          ........         
[2012-01-16 19:54:44 - ddms] Calling handler for TEST [com.android.ddmlib.HandleTest@718723] (len=8)
[2012-01-16 19:54:44 - ddm-test] handling TEST
[2012-01-16 19:54:44 - ddm-test] Received:
[2012-01-16 19:54:44 - ddm-test] 0000- 01 02 03 04 fc fd fe ff                          ........         
[2012-01-16 19:54:44 - ddms] Calling handler for REAQ [com.android.ddmlib.HandleHeap@1eebbe4] (len=1)
[2012-01-16 19:54:44 - ddm-heap] handling REAQ
[2012-01-16 19:54:44 - ddm-heap] REAQ says: enabled=false
[2012-01-16 19:54:44 - ddms] Calling handler for HELO [com.android.ddmlib.HandleHello@4367a2] (len=42)
[2012-01-16 19:54:44 - ddm-hello] handling HELO
[2012-01-16 19:54:44 - ddm-hello] HELO: v=1, pid=580, vm='Dalvik v1.1.0', app=''
[2012-01-16 19:54:44 - ddms] Calling handler for FEAT [com.android.ddmlib.HandleHello@4367a2] (len=86)
[2012-01-16 19:54:44 - ddm-hello] handling FEAT
[2012-01-16 19:54:44 - ddm-hello] Feature: method-trace-profiling
[2012-01-16 19:54:44 - ddm-hello] Feature: hprof-heap-dump
[2012-01-16 19:54:44 - ddms] Calling handler for MPRQ [com.android.ddmlib.HandleProfiling@1bdaf5a] (len=1)
[2012-01-16 19:54:44 - ddm-prof] handling MPRQ
[2012-01-16 19:54:44 - ddm-prof] Method profiling is not running
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=36)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=28)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:44 - ddms] Got empty reply for 0x40000112 from [Client pid: 580]
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:44 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:44 - ddm-thread] handling THCR
[2012-01-16 19:54:46 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:46 - ddm-thread] handling THDE
[2012-01-16 19:54:46 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=24)
[2012-01-16 19:54:46 - ddm-thread] handling THCR
[2012-01-16 19:54:46 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:46 - ddm-thread] handling THDE
[2012-01-16 19:54:46 - ddms] Closing [Client pid: 580]
[2012-01-16 19:54:46 - ddms] broadcast 3: [Client pid: 580]
[2012-01-16 19:54:46 - ddm-hello] Now disconnected: [Client pid: 580]
[2012-01-16 19:54:49 - ddms] Created: [Debugger 8615-->591 inactive]
[2012-01-16 19:54:49 - ddm-heap] Sending REAQ
[2012-01-16 19:54:49 - ddms] Adding new client [Client pid: 591]
[2012-01-16 19:54:49 - ddms] Good handshake from client, sending HELO to 591
[2012-01-16 19:54:49 - ddm-hello] Sending HELO ID=0x40000114
[2012-01-16 19:54:49 - ddm-heap] Sending FEAT
[2012-01-16 19:54:49 - ddm-prof] Sending MPRQ
[2012-01-16 19:54:50 - ddms] broadcast 2: [Client pid: 591]
[2012-01-16 19:54:50 - ddm-hello] Now ready: [Client pid: 591]
[2012-01-16 19:54:50 - ddm-thread] Now ready: [Client pid: 591]
[2012-01-16 19:54:50 - ddm-thread] Sending THEN: true
[2012-01-16 19:54:50 - ddms] Calling handler for REAQ [com.android.ddmlib.HandleHeap@1eebbe4] (len=1)
[2012-01-16 19:54:50 - ddm-heap] handling REAQ
[2012-01-16 19:54:50 - ddm-heap] REAQ says: enabled=false
[2012-01-16 19:54:50 - ddms] Calling handler for HELO [com.android.ddmlib.HandleHello@4367a2] (len=42)
[2012-01-16 19:54:50 - ddm-hello] handling HELO
[2012-01-16 19:54:50 - ddm-hello] HELO: v=1, pid=591, vm='Dalvik v1.1.0', app=''
[2012-01-16 19:54:50 - ddms] Calling handler for FEAT [com.android.ddmlib.HandleHello@4367a2] (len=86)
[2012-01-16 19:54:50 - ddm-hello] handling FEAT
[2012-01-16 19:54:50 - ddm-hello] Feature: method-trace-profiling
[2012-01-16 19:54:50 - ddm-hello] Feature: hprof-heap-dump
[2012-01-16 19:54:50 - ddms] Calling handler for MPRQ [com.android.ddmlib.HandleProfiling@1bdaf5a] (len=1)
[2012-01-16 19:54:50 - ddm-prof] handling MPRQ
[2012-01-16 19:54:50 - ddm-prof] Method profiling is not running
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=36)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=28)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Got empty reply for 0x40000117 from [Client pid: 591]
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:50 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:50 - ddm-thread] handling THDE
[2012-01-16 19:54:50 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=24)
[2012-01-16 19:54:50 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:51 - ddm-thread] handling THDE
[2012-01-16 19:54:51 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:51 - ddm-thread] handling THDE
[2012-01-16 19:54:51 - ddms] Calling handler for THDE [com.android.ddmlib.HandleThread@13a3252] (len=4)
[2012-01-16 19:54:51 - ddm-thread] handling THDE
[2012-01-16 19:54:51 - ddms] Saving packet 0x1000000b
[2012-01-16 19:54:51 - ddms] Closing [Client pid: 591]
[2012-01-16 19:54:51 - ddms] broadcast 3: [Client pid: 591]
[2012-01-16 19:54:51 - ddm-hello] Now disconnected: [Client pid: 591]
[2012-01-16 19:54:51 - ddms] Created: [Debugger 8615-->597 inactive]
[2012-01-16 19:54:51 - ddm-heap] Sending REAQ
[2012-01-16 19:54:51 - ddms] Adding new client [Client pid: 597]
[2012-01-16 19:54:51 - ddms] Good handshake from client, sending HELO to 597
[2012-01-16 19:54:51 - ddm-hello] Sending HELO ID=0x40000119
[2012-01-16 19:54:51 - ddm-heap] Sending FEAT
[2012-01-16 19:54:51 - ddm-prof] Sending MPRQ
[2012-01-16 19:54:51 - ddms] broadcast 2: [Client pid: 597]
[2012-01-16 19:54:51 - ddm-hello] Now ready: [Client pid: 597]
[2012-01-16 19:54:51 - ddm-thread] Now ready: [Client pid: 597]
[2012-01-16 19:54:51 - ddm-thread] Sending THEN: true
[2012-01-16 19:54:51 - ddms] Calling handler for TEST [com.android.ddmlib.HandleTest@718723] (len=8)
[2012-01-16 19:54:51 - ddm-test] handling TEST
[2012-01-16 19:54:51 - ddm-test] Received:
[2012-01-16 19:54:51 - ddm-test] 0000- 01 02 03 04 fc fd fe ff                          ........         
[2012-01-16 19:54:51 - ddms] Calling handler for TEST [com.android.ddmlib.HandleTest@718723] (len=8)
[2012-01-16 19:54:51 - ddm-test] handling TEST
[2012-01-16 19:54:51 - ddm-test] Received:
[2012-01-16 19:54:51 - ddm-test] 0000- 01 02 03 04 fc fd fe ff                          ........         
[2012-01-16 19:54:51 - ddms] Calling handler for REAQ [com.android.ddmlib.HandleHeap@1eebbe4] (len=1)
[2012-01-16 19:54:51 - ddm-heap] handling REAQ
[2012-01-16 19:54:51 - ddm-heap] REAQ says: enabled=false
[2012-01-16 19:54:51 - ddms] Calling handler for HELO [com.android.ddmlib.HandleHello@4367a2] (len=42)
[2012-01-16 19:54:51 - ddm-hello] handling HELO
[2012-01-16 19:54:51 - ddm-hello] HELO: v=1, pid=597, vm='Dalvik v1.1.0', app=''
[2012-01-16 19:54:51 - ddms] Calling handler for FEAT [com.android.ddmlib.HandleHello@4367a2] (len=86)
[2012-01-16 19:54:51 - ddm-hello] handling FEAT
[2012-01-16 19:54:51 - ddm-hello] Feature: method-trace-profiling
[2012-01-16 19:54:51 - ddm-hello] Feature: hprof-heap-dump
[2012-01-16 19:54:51 - ddms] Calling handler for MPRQ [com.android.ddmlib.HandleProfiling@1bdaf5a] (len=1)
[2012-01-16 19:54:51 - ddm-prof] handling MPRQ
[2012-01-16 19:54:51 - ddm-prof] Method profiling is not running
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=16)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=36)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=28)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Got empty reply for 0x4000011c from [Client pid: 597]
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for THCR [com.android.ddmlib.HandleThread@13a3252] (len=40)
[2012-01-16 19:54:51 - ddm-thread] handling THCR
[2012-01-16 19:54:51 - ddms] Calling handler for APNM [com.android.ddmlib.HandleAppName@148fc6a] (len=38)
[2012-01-16 19:54:51 - ddm-appname] handling APNM
[2012-01-16 19:54:51 - ddm-appname] APNM: app='<pre-initialized>'
[2012-01-16 19:54:51 - ddms] Calling handler for APNM [com.android.ddmlib.HandleAppName@148fc6a] (len=26)
[2012-01-16 19:54:51 - ddm-appname] handling APNM
[2012-01-16 19:54:51 - ddm-appname] APNM: app='my.contacts'
[2012-01-16 19:54:56 - ddms] Closing [Client pid: 597]
[2012-01-16 19:54:56 - ddms] broadcast 3: [Client pid: 597]
[2012-01-16 19:54:56 - ddm-hello] Now disconnected: [Client pid: 597]

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 17 янв 2012, 16:23

Вроде все верно. Только вот DataBase extends Activity - почему не разделите на два разных класса?

А в какой именно строке ошибка и какая ошибка?

Тут немного советов про log. viewtopic.php?f=3&t=110
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 17 янв 2012, 17:33

Сразу оговорюсь. в манифесте ни слова про DataBase.java , который содержит 2 класса для работы с базой данных. Наверное в этом ошибка. Но я исходил из логики, что у нас этот класс не отображается и по сути нам надо просто создать его объект и использовать. Но он расширяет Activity.. Значит надо в манифесте его прописывать? Но он не нуждается в файле xml..
Вроде все верно. Только вот DataBase extends Activity - почему не разделите на два разных класса?
Потому что не могу потом искать такие вещик, как findViewById, а также не может найти конструкторы (The constructor Intent(DataBase, Class<ContactListActivity>) is undefined) для dbHelper = new DBHelper(this); , LayoutInflater ltInflater = getLayoutInflater(); , Intent intent = new Intent(this, ContactListActivity.class); .

логи появились, нужно было перезапустить приложение. У меня 3 файла .java и 4 класса в общем.
Главный Activity доходит до момента, когда надо создать объект с DataBase классом.

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

db = new DataBase();
Далее в конструкторе DataBase приложение падает на

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

    DataBase() { 
        ...
        etId = (EditText) findViewById(R.id.etId);
        etJob = (EditText) findViewById(R.id.etJob);
        etName = (EditText) findViewById(R.id.etName);
        etPhone = (EditText) findViewById(R.id.etPhone);
        etEmail = (EditText) findViewById(R.id.etEmail);
    }
этих строках. Вот лог
01-17 13:41:45.302: E/AndroidRuntime(310): Uncaught handler: thread main exiting due to uncaught exception
01-17 13:41:45.322: E/AndroidRuntime(310): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.contacts/my.contacts.EditContactDBActivity}: java.lang.NullPointerException
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.os.Looper.loop(Looper.java:123)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread.main(ActivityThread.java:4363)
01-17 13:41:45.322: E/AndroidRuntime(310): at java.lang.reflect.Method.invokeNative(Native Method)
01-17 13:41:45.322: E/AndroidRuntime(310): at java.lang.reflect.Method.invoke(Method.java:521)
01-17 13:41:45.322: E/AndroidRuntime(310): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-17 13:41:45.322: E/AndroidRuntime(310): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-17 13:41:45.322: E/AndroidRuntime(310): at dalvik.system.NativeStart.main(Native Method)
01-17 13:41:45.322: E/AndroidRuntime(310): Caused by: java.lang.NullPointerException
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.Activity.findViewById(Activity.java:1612)
01-17 13:41:45.322: E/AndroidRuntime(310): at my.contacts.DataBase.<init>(DataBase.java:40)
01-17 13:41:45.322: E/AndroidRuntime(310): at my.contacts.EditContactDBActivity.onCreate(EditContactDBActivity.java:55)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-17 13:41:45.322: E/AndroidRuntime(310): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-17 13:41:45.322: E/AndroidRuntime(310): ... 11 more
Доступ я никакой не прописывал приложению. Вы в своем уроке тоже не прописывали доступ. может он еще как-то роль играет...

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 17 янв 2012, 18:18

Ошибка идет на findViewById скорее всего потому, что Activity не создалось само нормальным способом через Intent. Создание нового класса недостаточно.

Класс по работе с БД и не должен уметь вызывать Intent-ы и выполнять findViewById. Это дело Activity. И логически их лучше разделить.

DBClass - умеет работать с БД, он должен содержать методы, которые возвращают Cursor с записями.
А Activity эти методы вызывает, получает курсор и из него использует данные.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Помогите найти ошибку в коде.

Сообщение Mikhail_dev » 17 янв 2012, 19:14

Я уже что-то совсем запутался. Изначально проблема была в том, что нельзя создать элементы на другом Activity, обращаясь к другим элементам чужого Activity. Как мне вот с этим поступить? Допустим я разделю базу от другого Activity.
Тоесть получится: первая Activity создает объект базы данных, через методы базы данных мы с ней работаем. А теперь допустим нам надо вывести информацию во второй Activity, еще не созданный до этого. Но мы этого не можем сделать.
damager82 писал(а):Метод findViewById, который вы вызываете, ищет компоненты на текущей Activity. Он не найдет компоненты с другой и поэтому возвращает null.
Или нам надо создавать второй Activity и передавать как-то в него Cursor? Подскажите, пожалуйста саму схему работы.
Ошибка идет на findViewById скорее всего потому, что Activity не создалось само нормальным способом через Intent. Создание нового класса недостаточно.
Тоесть объект класса мы не можем создать через new нормально? Только через Intent?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Помогите найти ошибку в коде.

Сообщение damager82 » 18 янв 2012, 09:46

no-- писал(а):Тоесть объект класса мы не можем создать через new нормально? Только через Intent?
Создать то можем, только вот это не будет полноценным Acvtivity, с которым получится работать.

Есть отличный пример, демонстрирующий схему работы с БД и двумя Activity:
http://developer.android.com/resources/ ... index.html

Там можно скачать исходники и посмотреть, как лучше делать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить