Tuesday 16 January 2018

android - App crashes on findViewById()

itemprop="text">



So I have a
ListView in my activity_main.xml. Also a TextView in a different xml
da_item.xml.
The textview is for the individual listview items.



Now in my code there is a
onContextItemSelected() function which calls
bucketMarkItem(long itemTitle).
bucketMarkItem(long itemTitle) changes the last item's
background color using function
colorCorrection().




The
whole code works fine.



But I have a button with
enterItem() onClick listener. I call the same
colorCorrection() from inside
enterItem() and the app crashes.
It crashes on
this line.



TextView
txtDep1=(TextView)listItemBla1.findViewById(R.id.tv);


And
I have no idea why.




I've seen many
question like this and the answer was to use
setContentView(R.layout.activity_main) but I've already
included
this.



onContextItemSelected
Code



@Override
public
boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method
stub
super.onContextItemSelected(item);


AdapterContextMenuInfo info = (AdapterContextMenuInfo)
item.getMenuInfo();

long hula = info.id;


if(item.getTitle()=="Mark as Done"){
bucketMarkItem(hula);

}
if(item.getTitle()=="Mark as Undone"){

bucketUnMarkItem(hula);
}
if(item.getTitle()=="Delete
Item"){
bucketDeletelistItem(hula);


}

return
true;
}


bucketMarkItem()
Code



private void
bucketMarkItem(long itemTitle) {
// TODO Auto-generated method
stub

View
listItemBla=(View)list.getChildAt((int)(long)itemTitle);
TextView
txtDep=(TextView)listItemBla.findViewById(R.id.tv);

txtDep.setBackgroundColor(Color.GREEN);

String txtDepText =
""+txtDep.getText();
String[] result = txtDepText.split(" ");

String result1 = result[1];

Cursor cursor =
myDB.getAllRows();


if(cursor.moveToFirst()){

do{
if(result1.equals(cursor.getString(1))){
long yourDBID =
yourDB.insertRow(cursor.getInt(0));
}

}while(cursor.moveToNext());
}
cursor.close();

colorCorrecton();
}



colorCorrecton
Code



private void
colorCorrecton() {

Toast.makeText(MainActivity.this,""+
list.getCount(), Toast.LENGTH_SHORT).show();

View
listItemBla1=(View)list.getChildAt((list.getCount()-1));
TextView
txtDep1=(TextView)listItemBla1.findViewById(R.id.tv);



Toast.makeText(MainActivity.this, ""+txtDep1.getText(),
Toast.LENGTH_SHORT).show();

txtDep.setBackgroundColor(Color.GREEN);
}


enterItem()
Code



public void
enterItem(View v) {
// TODO Auto-generated method
stub

EditText
dataEntry_EditText=(EditText)findViewById(R.id.editText1);
Editable
dataEntry_Editable = dataEntry_EditText.getText();
String dataEntry_Finaldata
= dataEntry_Editable.toString();
long newId =
myDB.insertRow(dataEntry_Finaldata, 233,
"red");

//Toast.makeText(MainActivity.this, dataEntry_Finaldata,
Toast.LENGTH_LONG).show();
dataEntry_EditText.setText("");

populateListView();


//Toast.makeText(MainActivity.this,
""+list.getCount(),
Toast.LENGTH_LONG).show();
colorCorrecton();
}


Complete
Code



package
com.example.bucketlist;

import
java.util.ArrayList;


import
android.support.v4.app.FragmentActivity;
import
android.text.Editable;
import android.database.Cursor;
import
android.graphics.Color;
import android.os.Bundle;
import
android.view.ContextMenu;
import android.view.MenuItem;
import
android.view.View;
import
android.view.ContextMenu.ContextMenuInfo;

import
android.widget.AdapterView.AdapterContextMenuInfo;
import
android.widget.ArrayAdapter;
import android.widget.EditText;

import android.widget.ImageView;
import android.widget.ListView;

import android.widget.TextView;
import
android.widget.Toast;

public class MainActivity extends
FragmentActivity {


ListView list;
DBAdapter
myDB;
DBAdapter1 yourDB;

@Override
protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView bucketMenu =
(ImageView)findViewById(R.id.bucketMenuW);

list=
(ListView)findViewById(R.id.listView1);

registerForContextMenu(list);
openDB();

populateListView();

//colorCorrecton();

}

private void
colorCorrecton() {


Toast.makeText(MainActivity.this,""+
list.getCount(), Toast.LENGTH_SHORT).show();

View
listItemBla1=(View)list.getChildAt((list.getCount()-1));
TextView
txtDep1=(TextView)listItemBla1.findViewById(R.id.tv);


Toast.makeText(MainActivity.this, ""+txtDep1.getText(),
Toast.LENGTH_SHORT).show();

//txtDep.setBackgroundColor(Color.GREEN);
}

public void
conMenu(View v) {

// TODO Auto-generated method
stub
}

@Override
public void
onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
// TODO Auto-generated method stub

super.onCreateContextMenu(menu, v, menuInfo);


if(v.getId()==R.id.listView1){

menu.add("Mark as
Done");
menu.add("Mark as Undone");
menu.add("Delete
Item");
}
}

@Override
public boolean
onContextItemSelected(MenuItem item) {
// TODO Auto-generated method
stub
super.onContextItemSelected(item);



AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

long hula = info.id;

if(item.getTitle()=="Mark as
Done"){
bucketMarkItem(hula);
}

if(item.getTitle()=="Mark as Undone"){
bucketUnMarkItem(hula);

}

if(item.getTitle()=="Delete Item"){

bucketDeletelistItem(hula);
}

return
true;
}

private void bucketUnMarkItem(long itemTitle)
{
// TODO Auto-generated method stub
View
listItemBla=(View)list.getChildAt((int)(long)itemTitle);

TextView
txtDep=(TextView)listItemBla.findViewById(R.id.tv);
String txtDepText =
""+txtDep.getText();
String[] result = txtDepText.split(" ");

String result1 = result[1];

Cursor cursor =
myDB.getAllRows();

int markID=0;

if(cursor.moveToFirst()){
do{


if(result1.equals(cursor.getString(1))){
markID =
cursor.getInt(0);
}
}while(cursor.moveToNext());

}
cursor.close();
//Toast.makeText(MainActivity.this,
""+list.getCount(), Toast.LENGTH_LONG).show();

Cursor cursor1 =
yourDB.getAllRows();



if(cursor1.moveToFirst()){
do{
if(markID ==
cursor1.getInt(1)){
boolean newid2 =
yourDB.deleteRow(cursor1.getInt(0));
}

}while(cursor1.moveToNext());
}

cursor1.close();


colorCorrecton();

}

private void
bucketMarkItem(long itemTitle) {
// TODO Auto-generated method
stub
View listItemBla=(View)list.getChildAt((int)(long)itemTitle);

TextView txtDep=(TextView)listItemBla.findViewById(R.id.tv);

txtDep.setBackgroundColor(Color.GREEN);

String txtDepText =
""+txtDep.getText();
String[] result = txtDepText.split("
");

String result1 = result[1];

Cursor
cursor = myDB.getAllRows();

if(cursor.moveToFirst()){

do{
if(result1.equals(cursor.getString(1))){
long yourDBID =
yourDB.insertRow(cursor.getInt(0));
}

}while(cursor.moveToNext());

}

cursor.close();
}

public void deleteItem(View v)
{
// TODO Auto-generated method stub
myDB.deleteAll();

yourDB.deleteAll();

populateListView();
}


private void
bucketDeletelistItem(long itemTitle) {
View
listItemBla=(View)list.getChildAt((int)(long)itemTitle);
TextView
txtDep=(TextView)listItemBla.findViewById(R.id.tv);
String txtDepText =
""+txtDep.getText();
String[] result = txtDepText.split(" ");

String result1 = result[1];

Cursor cursor =
myDB.getAllRows();


int markID=0;

if(cursor.moveToFirst()){
do{

if(result1.equals(cursor.getString(1))){
boolean newid1 =
myDB.deleteRow(cursor.getInt(0));
markID = cursor.getInt(0);

}
}while(cursor.moveToNext());
}

cursor.close();

populateListView();

//Toast.makeText(MainActivity.this, ""+list.getCount(),
Toast.LENGTH_LONG).show();

Cursor cursor1 =
yourDB.getAllRows();

if(cursor1.moveToFirst()){

do{
if(markID == cursor1.getInt(1)){
boolean newid2 =
yourDB.deleteRow(cursor1.getInt(0));
}


}while(cursor1.moveToNext());
}

cursor1.close();


colorCorrecton();
}

public void enterItem(View v)
{
// TODO Auto-generated method stub
EditText
dataEntry_EditText=(EditText)findViewById(R.id.editText1);


Editable dataEntry_Editable = dataEntry_EditText.getText();
String
dataEntry_Finaldata = dataEntry_Editable.toString();
long newId =
myDB.insertRow(dataEntry_Finaldata, 233, "red");


//Toast.makeText(MainActivity.this, dataEntry_Finaldata,
Toast.LENGTH_LONG).show();

dataEntry_EditText.setText("");


populateListView();

//Toast.makeText(MainActivity.this,
""+list.getCount(), Toast.LENGTH_LONG).show();


colorCorrecton();
}

@Override
protected void
onDestroy() {
// TODO Auto-generated method stub

super.onDestroy();

closeDB();
}


private void closeDB()
{
// TODO Auto-generated method stub

myDB.close();
}

private void openDB() {
//
TODO Auto-generated method stub
myDB = new DBAdapter(this);
yourDB
= new DBAdapter1(this);
myDB.open();


yourDB.open();
}

private void populateListView()
{
// TODO Auto-generated method stub

Cursor cursor =
myDB.getAllRows();
ArrayList myItems = new
ArrayList();
//String[] myItems =
{};


if(cursor.moveToFirst()){
int
countData=0;
do{
countData=countData+1;
int id =
cursor.getInt(0);
String name = "#"+countData +"- "+
cursor.getString(1);
myItems.add(name);

}while(cursor.moveToNext());
}

cursor.close();


ArrayAdapter adapter =
new ArrayAdapter(this,R.layout.da_item,myItems);


list.setAdapter(adapter);

//Toast.makeText(MainActivity.this,
Integer.toString(list.getFirstVisiblePosition())+","+Integer.toString(list.getLastVisiblePosition()),
Toast.LENGTH_LONG).show();
//View v = list.getChildAt(0);

//v.setBackgroundColor(005566);
//View
listItemBla=(View)list.getChildAt(list.getFirstVisiblePosition());

//Toast.makeText(MainActivity.this, ""+ list.getChildCount(),
Toast.LENGTH_LONG).show();

//TextView
txtDep=(TextView)listItemBla.findViewById(R.id.tv);

//txtDep.setBackgroundColor(Color.parseColor("00FF00"));
}

}


Logcat




06-21 09:46:13.656: D/libEGL(24175): loaded
/system/lib/egl/libEGL_adreno200.so

06-21 09:46:13.656:
D/libEGL(24175): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
06-21
09:46:13.656: D/libEGL(24175): loaded /system/lib/egl/libGLESv2_adreno200.so

06-21 09:46:13.666: I/Adreno200-EGL(24175): : EGL
1.4 QUALCOMM build:
AU_LINUX_ANDROID_JB_2.5.04.02.02.040.400_msm8960_JB_2.5_CL3744273_release_AU
(CL3744273)
06-21 09:46:13.666: I/Adreno200-EGL(24175): Build Date: 06/30/13
Sun
06-21 09:46:13.666: I/Adreno200-EGL(24175): Local Branch:

06-21 09:46:13.666: I/Adreno200-EGL(24175): Remote Branch: quic/jb_2.5
06-21
09:46:13.666: I/Adreno200-EGL(24175): Local Patches: NONE
06-21 09:46:13.666:
I/Adreno200-EGL(24175): Reconstruct Branch: AU_LINUX_ANDROID_JB_2.5.04.02.02.040.400 +
NOTHING
06-21 09:46:13.706: D/OpenGLRenderer(24175): Enabling debug mode
0
06-21 09:46:24.217: D/AndroidRuntime(24175): Shutting down
VM

06-21 09:46:24.217: W/dalvikvm(24175): threadid=1: thread
exiting with uncaught exception (group=0x40c12ae0)
06-21 09:46:24.217:
E/AndroidRuntime(24175): FATAL EXCEPTION: main
06-21 09:46:24.217:
E/AndroidRuntime(24175): java.lang.IllegalStateException: Could not execute method of
the activity
06-21 09:46:24.217: E/AndroidRuntime(24175): at
android.view.View$1.onClick(View.java:3673)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at android.view.View.performClick(View.java:4278)

06-21 09:46:24.217: E/AndroidRuntime(24175): at
android.view.View$PerformClick.run(View.java:17429)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at
android.os.Handler.handleCallback(Handler.java:725)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at
android.os.Handler.dispatchMessage(Handler.java:92)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at android.os.Looper.loop(Looper.java:137)
06-21
09:46:24.217: E/AndroidRuntime(24175): at
android.app.ActivityThread.main(ActivityThread.java:5099)

06-21
09:46:24.217: E/AndroidRuntime(24175): at java.lang.reflect.Method.invokeNative(Native
Method)
06-21 09:46:24.217: E/AndroidRuntime(24175): at
java.lang.reflect.Method.invoke(Method.java:511)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)

06-21 09:46:24.217: E/AndroidRuntime(24175): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
06-21
09:46:24.217: E/AndroidRuntime(24175): at dalvik.system.NativeStart.main(Native
Method)
06-21 09:46:24.217: E/AndroidRuntime(24175): Caused by:
java.lang.reflect.InvocationTargetException
06-21 09:46:24.217:
E/AndroidRuntime(24175): at java.lang.reflect.Method.invokeNative(Native
Method)
06-21 09:46:24.217: E/AndroidRuntime(24175): at
java.lang.reflect.Method.invoke(Method.java:511)
06-21 09:46:24.217:
E/AndroidRuntime(24175): at android.view.View$1.onClick(View.java:3668)
06-21
09:46:24.217: E/AndroidRuntime(24175): ... 11 more

06-21
09:46:24.217: E/AndroidRuntime(24175): Caused by:
java.lang.NullPointerException
06-21 09:46:24.217: E/AndroidRuntime(24175):
at com.example.bucketlist.MainActivity.colorCorrecton(MainActivity.java:47)

06-21 09:46:24.217: E/AndroidRuntime(24175): at
com.example.bucketlist.MainActivity.enterItem(MainActivity.java:204)
06-21
09:46:24.217: E/AndroidRuntime(24175): ... 14 more
06-21 09:46:26.069:
I/Process(24175): Sending signal. PID: 24175 SIG:
9

itemprop="text">
class="normal">Answer



The
problem is, using



TextView
txtDep1=(TextView)listItemBla1.findViewById(R.id.tv);



is
telling the system to look inside of listItemBla1 for a View
with an id of tv which it obviously won't find because no
View can exist inside your ListView
(at least not how you expect it to).



What you
need to do is create a custom adapter and override getView()
where you can inflate the layout with the TextView you
want.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...