无法为我的 Android 应用程序使用 putExtra( ) 和 getExtras( )
Unable to use putExtra( ) and getExtras( ) for my Android App
我想将电影名称从 MainActivity(ListView) 发送到 SongActivity。这是我试过的。
MainActivity.java
public class MainActivity extends Activity{
Activity context;
HttpPost httppost;
StringBuffer buffer;
HttpResponse response;
HttpClient httpclient;
ProgressDialog pd;
CustomAdapter adapter;
ListView listProduct;
ArrayList<String> records;
protected void onCreate(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
records=new ArrayList<String>();
listProduct=(ListView)findViewById(R.id.product_list);
adapter=new CustomAdapter(context, R.layout.list_item,R.id.pro_name, records);
listProduct.setAdapter(adapter);
listProduct.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id){
String sText = ((TextView) v).getText().toString();
Intent songIntent = new Intent(getApplicationContext(), SongActivity.class);
songIntent.putExtra("movie_name", sText );
startActivity(songIntent);
}
});
}
这是我的SongActivity.java
package com.example.telugump3;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class SongActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.song_activity);
TextView tt = (TextView)findViewById(R.id.testing);
Intent iin= getIntent();
Bundle b = iin.getExtras();
if(b!=null)
{
String j =(String) b.get("movie_name");
tt.setText(j);
}
}
logcat
03-22 17:17:20.949: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 46
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 50
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.969: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 53
03-22 17:17:20.999: D/OpenGLRenderer(22747): Enabling debug mode 0
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 11
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 12
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 13
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 14
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 15
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 16
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 17
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 18
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 19
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 20
03-22 17:17:25.289: D/AndroidRuntime(22747): Shutting down VM
03-22 17:17:25.289: W/dalvikvm(22747): threadid=1: thread exiting with uncaught exception (group=0x430ef140)
03-22 17:17:25.299: E/AndroidRuntime(22747): FATAL EXCEPTION: main
03-22 17:17:25.299: E/AndroidRuntime(22747): Process: com.example.telugump3, PID: 22747
03-22 17:17:25.299: E/AndroidRuntime(22747): java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.example.telugump3.MainActivity.onItemClick(MainActivity.java:51)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AdapterView.performItemClick(AdapterView.java:299)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2949)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView.run(AbsListView.java:3683)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Handler.handleCallback(Handler.java:733)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Handler.dispatchMessage(Handler.java:95)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Looper.loop(Looper.java:149)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.app.ActivityThread.main(ActivityThread.java:5257)
03-22 17:17:25.299: E/AndroidRuntime(22747): at java.lang.reflect.Method.invokeNative(Native Method)
03-22 17:17:25.299: E/AndroidRuntime(22747): at java.lang.reflect.Method.invoke(Method.java:515)
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
03-22 17:17:25.299: E/AndroidRuntime(22747): at dalvik.system.NativeStart.main(Native Method)
03-22 17:17:27.259: I/Process(22747): Sending signal. PID: 22747 SIG: 9
我试过删除 putExtra() 并且 SongActivity 完美启动。但是,如果我使用 putExtra(),当我单击 ListView 中的任何项目时,应用程序会崩溃。我只想要点击项目的文本,以便我可以在其他 Activity.
中使用它
尝试:String j =(String) b.getString("movie_name");
Source
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
您正在将 RelativeLayout
转换为 TextView
。检查你的 findViewById()
调用是否有这样的转换或者你使用了错误的 id
发送时执行此操作
intent.putExtra("message", message);
并在接收时
Intent intent = getIntent();
String message = intent.getStringExtra("message");
onItemClick 的参数 v 是列表视图项的根布局。这不是您的 TextView。所以你必须像下面这样修改。
//String sText = ((TextView) v).getText().toString();
String sText = ((TextView) v.findViewById(R.id.[your TextView id])).getText().toString();
Ops,你的 put or get Extra 没有问题,注意错误
你的问题是点击的目标是布局,并且布局无法投射到 TextView
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
at com.example.telugump3.MainActivity.onItemClick(MainActivity.java:51)
如您所见,您的问题与 extras 无关,但您知道去哪里查看,所以让我们看一下如何在 MainActivity
中声明您的项目适配器
adapter = new CustomAdapter(context, R.layout.list_item,R.id.pro_name, records);
我假设参数如下:上下文、布局 ID、文本视图 ID、数据集。所以在项目布局中 TextView
的 id 是 R.id.pro_name
.
现在让我们看看在 OnItemClickListener
:
时会发生什么
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id){
// arg0 is the ListView
// v is the whole item layout
String sText = ((TextView) v).getText().toString();
// you assumed that the whole layout was a TextView
// ...
}
现在您对问题出在哪里有了很好的了解。您有两个选择:
选项 1) 又快又脏。
String sText = ((TextView) v.findViewById(R.id.pro_name).getText().toString();
为什么这么糟糕?你必须在两个地方写 R.id.pro_name
。您正在将应用程序的表示层和模型层混合在一起 - 您不是在询问数据集,而是在询问已经依赖该数据集的人。
选项 2)要走的路。
String sText = adapter.getItem(position).toString();
您请求数据与列表视图使用的适配器相同。
我想将电影名称从 MainActivity(ListView) 发送到 SongActivity。这是我试过的。
MainActivity.java
public class MainActivity extends Activity{
Activity context;
HttpPost httppost;
StringBuffer buffer;
HttpResponse response;
HttpClient httpclient;
ProgressDialog pd;
CustomAdapter adapter;
ListView listProduct;
ArrayList<String> records;
protected void onCreate(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
records=new ArrayList<String>();
listProduct=(ListView)findViewById(R.id.product_list);
adapter=new CustomAdapter(context, R.layout.list_item,R.id.pro_name, records);
listProduct.setAdapter(adapter);
listProduct.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id){
String sText = ((TextView) v).getText().toString();
Intent songIntent = new Intent(getApplicationContext(), SongActivity.class);
songIntent.putExtra("movie_name", sText );
startActivity(songIntent);
}
});
}
这是我的SongActivity.java
package com.example.telugump3;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class SongActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.song_activity);
TextView tt = (TextView)findViewById(R.id.testing);
Intent iin= getIntent();
Bundle b = iin.getExtras();
if(b!=null)
{
String j =(String) b.get("movie_name");
tt.setText(j);
}
}
logcat
03-22 17:17:20.949: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 46
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 50
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.959: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 51
03-22 17:17:20.969: E/IMGSRV(22747): :0: PVRDRMOpen: TP3, ret = 53
03-22 17:17:20.999: D/OpenGLRenderer(22747): Enabling debug mode 0
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 11
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 12
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 13
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 14
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 15
03-22 17:17:23.149: I/dalvikvm(22747): Total arena pages for JIT: 16
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 17
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 18
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 19
03-22 17:17:23.159: I/dalvikvm(22747): Total arena pages for JIT: 20
03-22 17:17:25.289: D/AndroidRuntime(22747): Shutting down VM
03-22 17:17:25.289: W/dalvikvm(22747): threadid=1: thread exiting with uncaught exception (group=0x430ef140)
03-22 17:17:25.299: E/AndroidRuntime(22747): FATAL EXCEPTION: main
03-22 17:17:25.299: E/AndroidRuntime(22747): Process: com.example.telugump3, PID: 22747
03-22 17:17:25.299: E/AndroidRuntime(22747): java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.example.telugump3.MainActivity.onItemClick(MainActivity.java:51)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AdapterView.performItemClick(AdapterView.java:299)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2949)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.widget.AbsListView.run(AbsListView.java:3683)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Handler.handleCallback(Handler.java:733)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Handler.dispatchMessage(Handler.java:95)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.os.Looper.loop(Looper.java:149)
03-22 17:17:25.299: E/AndroidRuntime(22747): at android.app.ActivityThread.main(ActivityThread.java:5257)
03-22 17:17:25.299: E/AndroidRuntime(22747): at java.lang.reflect.Method.invokeNative(Native Method)
03-22 17:17:25.299: E/AndroidRuntime(22747): at java.lang.reflect.Method.invoke(Method.java:515)
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-22 17:17:25.299: E/AndroidRuntime(22747): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
03-22 17:17:25.299: E/AndroidRuntime(22747): at dalvik.system.NativeStart.main(Native Method)
03-22 17:17:27.259: I/Process(22747): Sending signal. PID: 22747 SIG: 9
我试过删除 putExtra() 并且 SongActivity 完美启动。但是,如果我使用 putExtra(),当我单击 ListView 中的任何项目时,应用程序会崩溃。我只想要点击项目的文本,以便我可以在其他 Activity.
中使用它尝试:String j =(String) b.getString("movie_name");
Source
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
您正在将 RelativeLayout
转换为 TextView
。检查你的 findViewById()
调用是否有这样的转换或者你使用了错误的 id
发送时执行此操作
intent.putExtra("message", message);
并在接收时
Intent intent = getIntent();
String message = intent.getStringExtra("message");
onItemClick 的参数 v 是列表视图项的根布局。这不是您的 TextView。所以你必须像下面这样修改。
//String sText = ((TextView) v).getText().toString();
String sText = ((TextView) v.findViewById(R.id.[your TextView id])).getText().toString();
Ops,你的 put or get Extra 没有问题,注意错误 你的问题是点击的目标是布局,并且布局无法投射到 TextView
java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
at com.example.telugump3.MainActivity.onItemClick(MainActivity.java:51)
如您所见,您的问题与 extras 无关,但您知道去哪里查看,所以让我们看一下如何在 MainActivity
adapter = new CustomAdapter(context, R.layout.list_item,R.id.pro_name, records);
我假设参数如下:上下文、布局 ID、文本视图 ID、数据集。所以在项目布局中 TextView
的 id 是 R.id.pro_name
.
现在让我们看看在 OnItemClickListener
:
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id){
// arg0 is the ListView
// v is the whole item layout
String sText = ((TextView) v).getText().toString();
// you assumed that the whole layout was a TextView
// ...
}
现在您对问题出在哪里有了很好的了解。您有两个选择:
选项 1) 又快又脏。
String sText = ((TextView) v.findViewById(R.id.pro_name).getText().toString();
为什么这么糟糕?你必须在两个地方写 R.id.pro_name
。您正在将应用程序的表示层和模型层混合在一起 - 您不是在询问数据集,而是在询问已经依赖该数据集的人。
选项 2)要走的路。
String sText = adapter.getItem(position).toString();
您请求数据与列表视图使用的适配器相同。