programacion - Debe proporcionar un ID de recurso para un error de TextView en Android
manual de programacion android pdf (4)
Intento todo este día para resolver este error. No entiendo por qué mi logcat imprime:
05-06 21:45:59.559: ERROR/ConversationList(9023): We have chats... 05-06 21:45:59.609: ERROR/ConversationList(9023): UpdateList end... 05-06 21:45:59.839: ERROR/ArrayAdapter(9023): You must supply a resource ID for a TextView 05-06 21:45:59.839: DEBUG/AndroidRuntime(9023): Shutting down VM 05-06 21:45:59.839: WARN/dalvikvm(9023): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 05-06 21:45:59.839: ERROR/AndroidRuntime(9023): Uncaught handler: thread main exiting due to uncaught exception 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.AbsListView.obtainView(AbsListView.java:1269) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ListView.makeAndAddView(ListView.java:1623) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ListView.fillDown(ListView.java:607) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ListView.fillFromTop(ListView.java:664) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ListView.layoutChildren(ListView.java:1481) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.AbsListView.onLayout(AbsListView.java:1113) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.View.layout(View.java:6133) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.View.layout(View.java:6133) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.View.layout(View.java:6133) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.View.layout(View.java:6133) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.View.layout(View.java:6133) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.ViewRoot.performTraversals(ViewRoot.java:929) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.view.ViewRoot.handleMessage(ViewRoot.java:1482) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.os.Handler.dispatchMessage(Handler.java:99) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.os.Looper.loop(Looper.java:123) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.app.ActivityThread.main(ActivityThread.java:3948) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at java.lang.reflect.Method.invokeNative(Native Method) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at java.lang.reflect.Method.invoke(Method.java:521) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at dalvik.system.NativeStart.main(Native Method) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): Caused by: java.lang.ClassCastException: android.widget.LinearLayout 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:340) 05-06 21:45:59.879: ERROR/AndroidRuntime(9023): ... 30 more
Mi archivo Java:
package fshizzle.com;
import java.util.ArrayList;
import android.app.ListActivity;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import cz.jabbim.android.data.JabberoidDbConnector;
import fshizzle.com.R;
public class ConversationList extends ListActivity {
// private static final String TAG = "ConversationList.class";
private static final int RESULT_CHAT = 4004;
private static final int RESULT_DIRECTCHAT = 4005;
private static final String TAG = "ConversationList";
private ArrayList<String> chatList = new ArrayList<String>();
private TextView tv;
private String lastJid;
BroadcastReceiver csr;
IntentFilter f;
boolean show = true;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.conversationlist);
tv = (TextView)findViewById(R.id.contactList_NoConversation);
csr = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
getChats();
updateList(false);
}
};
f = new IntentFilter();
f.addAction("cz.jabbim.android.androidim.NEW_MESSAGE");
registerForContextMenu(getListView());
}
@Override
public void onStart() {
super.onStart();
getChats();
updateList(show);
show = true;
if(getIntent().getBooleanExtra("startChat", false)) {
startChat(getIntent().getStringExtra("jid"));
show = false;
}
}
@Override
public void onResume() {
super.onResume();
cancelNotification();
registerReceiver(csr, f);
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(csr);
}
@Override
public void onStop() {
super.onStop();
}
@Override
protected void onListItemClick(ListView lv, View v, int pos, long id) {
super.onListItemClick(lv, v, pos, id);
startChat(pos);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
new MenuInflater(getApplication()).inflate(R.menu.conversationlist_context, menu);
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo)menuInfo;
menu.setHeaderTitle("Chat with " + getJid(acmi.position));
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
switch(item.getItemId()) {
case R.id.menuEnter:
startChat(acmi.position);
return true;
case R.id.menuCloseChat:
closeChat(acmi.position);
return true;
}
return super.onContextItemSelected(item);
}
private int getChats() {
final String[] returnColumns = {
Constants.TABLE_CONVERSATION_FIELD_ID,
Constants.TABLE_CONVERSATION_FIELD_CHAT,
"MIN("+(Constants.TABLE_CONVERSATION_FIELD_DATE)+") as ''firstReceived''",
};
SQLiteDatabase db = new JabberoidDbConnector(this).getWritableDatabase();
Cursor result = db.query(Constants.TABLE_CONVERSATION,
returnColumns,
null, //Constants.TABLE_CONVERSATION_FIELD_FROM + "!= ''me''",
null,
Constants.TABLE_CONVERSATION_FIELD_CHAT,
null,
"firstReceived ASC" );
int count = result.getCount();
chatList.clear();
result.moveToFirst();
while(!result.isAfterLast()) {
chatList.add(result.getString(result.getColumnIndex(Constants.TABLE_CONVERSATION_FIELD_CHAT)));
//chatList.add("[email protected]");
result.moveToNext();
}
result.close();
result = null;
db.close();
return count;
}
private void updateList(boolean startChat) {
if(chatList.size() > 0) {
if(chatList.size()==1 && startChat) {
startChat(0);
}
Log.e(TAG, "We have chats...");
tv.setVisibility(View.GONE);
getListView().setVisibility(View.VISIBLE);
ListAdapter adapter = new ArrayAdapter<String>(
this,
R.layout.conversation_item,
chatList
);
getListView().setAdapter(adapter);
//startChat("[email protected]");
// startChat(getIntent().getStringExtra("fromUser"));
} else {
Log.e(TAG, "We don''t have chats...");
getListView().setVisibility(View.GONE);
tv.setVisibility(View.VISIBLE);
tv.setText(R.string.conversationList_noOpenConversation);
}
// close the database after usage
Log.e(TAG, "UpdateList end...");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==RESULT_CHAT) {
int chats = getChats();
if(chats==0) {
finish();
} else if(chats==1) {
String jid;
jid = getJid(0);
if(lastJid.equals(jid)) {
finish();
} else {
show = false;
}
} else {
show = false;
}
} else if (requestCode==RESULT_DIRECTCHAT) {
finish();
}
}
private void cancelNotification() {
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
nm.cancel(Constants.NEW_MESSAGE_NOTIFICATION);
}
private void startChat(int pos) {
String jid = getJid(pos);
lastJid = jid;
finishActivity(RESULT_CHAT);
Intent i = new Intent(this, Conversations.class);
i.putExtra("jid", jid);
startActivityForResult(i, RESULT_CHAT);
setResult(RESULT_OK);
finish();
}
private void startChat(String jid) {
finishActivity(RESULT_DIRECTCHAT);
Intent i = new Intent(this, Conversations.class);
i.putExtra("jid", jid);
startActivityForResult(i, RESULT_DIRECTCHAT);
setResult(RESULT_OK);
finish();
}
private void closeChat(int pos) {
SQLiteDatabase db = new JabberoidDbConnector(this).getWritableDatabase();
db.delete(Constants.TABLE_CONVERSATION,
Constants.TABLE_CONVERSATION_FIELD_CHAT + " = ''" + getJid(pos) + "''",
null);
db.close();
getChats();
updateList(false);
}
private String getJid(int pos) {
return chatList.get(pos);
}
// private void handleUpdateList() {
// }
}
`
El error está aquí:
ListAdapter adapter = new ArrayAdapter<String>(
this,
R.layout.conversation_item,
chatList
);
getListView().setAdapter(adapter);
No hay error cuando lo elimino.
ListAdapter adapter = new ArrayAdapter<String>(
this,
R.layout.conversation_item,
chatList
);
getListView().setAdapter(adapter);
¿Cuál es la solución por favor?
conversation_item.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/conversation_item">
<TextView
android:layout_height="wrap_content"
android:id="@+id/conversation_item_name"
android:text="Name Surname"
android:textColor="#ffffff"
android:textStyle="bold"
android:textSize="16dip"
android:layout_width="fill_parent"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip"
android:layout_marginLeft="10dip">
</TextView>
<TextView
android:layout_height="wrap_content"
android:id="@+id/conversation_item_date"
android:layout_width="fill_parent"
android:text="17.6.2010 15:30">
</TextView>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/conversation_item_message"
android:text="Just some message..."
android:textColor="#ffffff">
</TextView>
</LinearLayout>
El constructor que está utilizando es estrictamente para un CheckedTextView. El problema surge debido a que también proporciona un diseño lineal en su archivo xml. La solución más simple es eliminar el diseño lineal y mantener solo el CheckedTextView. ¡Aclamaciones!
Es mejor usar un adaptador personalizado cada vez que un Array Of Objects se debe enumerar en una vista de diseño personalizado. Consulte esta referencia simple y hermosa al rellenar una vista de lista con un adaptador personalizado
Estoy bastante seguro de que el problema radica en el diseño de su conversation_item
. Los docs indican que debe proporcionar un recurso con un solo TextView. ¿Qué aspecto tiene ese diseño?
Como ejemplo, este es el aspecto del diseño simple_list_item_1, el tuyo debería ser bastante similar.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:paddingLeft="6dip"
android:minHeight="?android:attr/listPreferredItemHeight"
/>
EDITAR:
Acabo de editar la pregunta para que se vea su diseño. Su diseño es realmente incorrecto, no puede tener el diseño lineal allí si está utilizando ese constructor. Puede usar el otro constructor ( ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
) y proporcionar su diseño personalizado y su ID de TextView.
Tenía el mismo problema, necesitaba cambiar el adaptador personalizado de:
ListAdapter adapter = new ArrayAdapter<String>(
this,
R.layout.conversation_item,
chatList
);
getListView().setAdapter(adapter);
a:
ListAdapter adapter = new ArrayAdapter<String>(
this,
R.layout.conversation_item,
R.id.sometextview_from_the_layout,
chatList
);
getListView().setAdapter(adapter);
Creo que el TextView
seleccionado se utilizará para generar el rowid, lo que puede explicar su necesidad de ser único, pero aún no estoy seguro.