【问题标题】:Error in passing data传递数据错误
【发布时间】:2012-10-02 09:14:38
【问题描述】:

我有一个名称列表视图(从数据库导入)。单击列表中的名称时,我想从数据库中获取名称的详细信息,因此我必须将名称传递给我所在的下一个类检索详细信息。我正在尝试将名称从一个类传递到另一个类。我不知道我是传递错误的字符串还是以错误的方式获取字符串的名称。

contact.java:

public class Contacts extends Activity implements OnClickListener {
    int NewContact_Request_Code = 1;
    Button newcontact;
    ListView listview;
    public static final String LOG_TAG = "Contacts";
    int mInt = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contactview);// Set the content to contactview.xml

        // newcontact = NEW CONTACT button
        // listview = MyList List View
        newcontact = (Button) findViewById(R.id.baddcontact);
        listview = (ListView) findViewById(R.id.mylist);

        // Make a New Database
        DBContact info = new DBContact(this);
        // Open , get Information from database and close it
        info.open();
        String[] data = info.queryAll();
        info.close();
        // listview = getListView();
        listview.setTextFilterEnabled(true);
        // Display the names
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(Contacts.this,
                android.R.layout.simple_list_item_1, data);
        listview.setAdapter(adapter);
        listview.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?>listview, View view,
                    int position, long id) {

                String nameclicked = ((TextView)view).getText().toString();
                Intent viewintent = new Intent(Contacts.this, ViewContact.class);
                viewintent.putExtra("name_clicked", nameclicked);
                startActivity(viewintent);

            }
        });
        newcontact.setOnClickListener(this);

    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent newintent = new Intent(Contacts.this, AddNewContact.class);
        // start activity for result - to get the name of the new contact
        startActivityForResult(newintent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        // pass the value of the string via cursor and update the list
    }

}

viewcontact.java:

public class ViewContact extends Activity implements OnClickListener {
    Button ViewPPhone, ViewHPhone, ViewOPhone, EditContact;
    TextView ViewName;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewcontact);
        savedInstanceState = getIntent().getExtras();
        String name = savedInstanceState.getString("name_clicked");
        Long l = Long.parseLong(name);
        DBContact getdetails = new DBContact(this);
        getdetails.open();
        String returnedname = getdetails.getName(l);
        String returnedpphone = getdetails.getPphone(l);
        String returnedhphone = getdetails.getHphone(l);
        String returnedophone = getdetails.getOphone(l);
        getdetails.close();
        ViewName.setText(returnedname);
        ViewPPhone.setText(returnedpphone);
        ViewHPhone.setText(returnedhphone);
        ViewOPhone.setText(returnedophone);

        EditContact = (Button) findViewById(R.id.bEditContact);
        EditContact.setOnClickListener(this);
        ViewPPhone = (Button) findViewById(R.id.ViewPersonalPhoneNumber);
        ViewPPhone.setOnClickListener(this);
        ViewHPhone = (Button) findViewById(R.id.ViewHomePhoneNumber);
        ViewHPhone.setOnClickListener(this);
        ViewOPhone = (Button) findViewById(R.id.ViewOfficePhoneNumber);
        ViewOPhone.setOnClickListener(this);

    }

    public void onClick(View view) {
        // TODO Auto-generated method stub
        switch (view.getId()) {
        case R.id.ViewPersonalPhoneNumber:
        /*  Intent dialpersonalphone = new
            Intent(android.content.Intent.ACTION_DIAL,
            Uri.parse("returnedpphone"));
            startActivity(dialpersonalphone );*/
            break;

        case R.id.ViewHomePhoneNumber:
            /*Intent dialhome = new
            Intent(android.content.Intent.ACTION_DIAL,
            Uri.parse("returnedhphone"));
            startActivity(dialhome);*/
            break;

        case R.id.ViewOfficePhoneNumber:
            /*Intent dialoffice = new
            Intent(android.content.Intent.ACTION_DIAL,
            Uri.parse("returnedophone"));
            startActivity(dialoffice);*/
            break;

        case R.id.bEditContact:
            startActivity(new Intent("com.example.contactlist.EDITCONTACT"));
            break;
        }
    }

}

LOGCAT

10-02 10:30:23.064: E/AndroidRuntime(1045): FATAL EXCEPTION: main
10-02 10:30:23.064: E/AndroidRuntime(1045): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.contactlist/com.example.contactlist.ViewContact}: java.lang.NumberFormatException: Invalid long: "nishanth"
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.os.Looper.loop(Looper.java:137)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread.main(ActivityThread.java:4745)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.reflect.Method.invokeNative(Native Method)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.reflect.Method.invoke(Method.java:511)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at dalvik.system.NativeStart.main(Native Method)
10-02 10:30:23.064: E/AndroidRuntime(1045): Caused by: java.lang.NumberFormatException: Invalid long: "nishanth"
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.Long.invalidLong(Long.java:125)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.Long.parse(Long.java:362)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.Long.parseLong(Long.java:353)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at java.lang.Long.parseLong(Long.java:319)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at com.example.contactlist.ViewContact.onCreate(ViewContact.java:23)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.Activity.performCreate(Activity.java:5008)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-02 10:30:23.064: E/AndroidRuntime(1045):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-02 10:30:23.064: E/AndroidRuntime(1045):     ... 11 more

【问题讨论】:

    标签: android android-intent pass-data


    【解决方案1】:

    当我使用捆绑包传递信息时,我发现我需要实例化一个 os.Bundle 对象,然后在将此捆绑包添加到意图之前继续填充我的捆绑包信息。

    修改您的contact.java 代码以阅读;

        Intent viewintent = new Intent(Contacts.this, ViewContact.class);
        final Bundle bundle = new Bundle();
        bundle.putString("name_clicked", nameclicked);
        viewintent.putExtras(bundle);
        startActivity(viewintent);
    

    然后重新运行看看是否有效。

    编辑

    问题是String nameclicked = ((TextView)view).getText().toString(); 没有返回一个long-它返回联系人姓名“nishanth”!这在 logcat 日志中很明确;

    10-02 10:30:23.064: E/AndroidRuntime(1045): 由: java.lang.NumberFormatException:无效的长:“nishanth”

    ((TextView)view) 返回的视图不是电话号码,而是您的键“name_clicked”所暗示的联系人姓名。更改此视图以定位电话号码。请注意,电话号码可以包含“+”和“-”符号,因此这种检索所选电话号码的实现并非万无一失。

    【讨论】:

    • 我试过了,但没有用。我已经粘贴了整个代码。请看一下
    • 这是一个简单的问题。看起来您对尝试从视图中收集的信息感到困惑。请参阅我的更新答案。
    【解决方案2】:

    您正在尝试从savedInstanceState Bundle 获取字符串。 您想要做的是从启动activityIntent 获取String

    getIntent().getStringExtra("name_clicked");
    

    编辑:

    这可能是因为您试图将String name 解析为Long。你确定名字都是数字吗?

    如果您提供堆栈跟踪,也更容易查明问题

    【讨论】:

    • 我已经更新了整个代码以及日志猫。
    • 如前所述,问题在于您试图将包含字母的字符串解析为 Long。要么你从 Contact.java 传递了错误的值,要么你应该重新考虑你的代码的实现。电话号码通常不应存储为 long,因为它可以包含其他数字值。我的建议是让 DBContact 中的 getPphone(l) 方法接受 String 作为参数而不是 Long
    【解决方案3】:

    看到这个我们得到了想法使用setter和getter它非常使用这个lisk click

     list.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                      
    
                    Object  ob = (Object) view.getTag();                 
                    if(ob != null) 
                    {                       
                        Data da = (Data) view.getTag();              
                        String a = da.getSelected();
                        String a1 = da.getfunction();
                        int a2 = da.getImage();
    
                        Log.i(" val one " ,"_" +a);
                        Log.i(" val two ", "_"  +a1);
                        Log.i(" val three","_" +a2); 
    
                        Intent intent = new Intent(ListMobileActivity.this, Display.class);                         
                        intent.putExtra("passed", a);
                        intent.putExtra("passed1", a1);     
                        intent.putExtra("passed2" ,a2);                      
    
                        startActivity(intent);          
                    }
                }        
            });
    

    第二个活动

     TextView text = (TextView)findViewById(R.id.textView);
                TextView text1 = (TextView)findViewById(R.id.textView1);
                ImageView image = (ImageView)findViewById(R.id.imageView);
    
                message = getIntent().getExtras().getString("passed");
                message1 = getIntent().getExtras().getString("passed1");
                message2 = getIntent().getExtras().getInt("passed2");                          
    
                text.setText(message);
                text1.setText(message1);
                image.setBackgroundResource(message2);  
    

    这是setter和getter类

       public class Data {
    
        private String first;
        private String value;   
        private int image; 
    
        public void setSelected(String str) {
            this.first = str;
        }
        public String getSelected() {
            return first;
        }
        public void setfunction(String string) {
            this.value = string;
        }
        public String getfunction() {
            return value;
        }
        public void setImage(int image2) {
            this.image = image2;
        }
        public int getImage() {
            return image;
        }    
    
    }
    

    【讨论】:

    • 还是不行。我已经粘贴了整个代码。请看一下
    【解决方案4】:

    为了传递

    viewintent.putExtra("name_clicked", nameclicked);
    

    为了进入 viewcontact.java

    String name = getIntent().getStringExtra("name_clicked");
    

    编辑----------

    您正在发送一个 string 到另一个活动,然后在捕获它之后尝试将该 string 转换为 long

    因此,您会收到 NumberFormatException

    请参阅 ViewContact.java 的 23 no line where you are conversion string to long

    Caused by: java.lang.NumberFormatException: Invalid long: "nishanth"
    
    at com.example.contactlist.ViewContact.onCreate(ViewContact.java:23)
    

    【讨论】:

    • 没有工作:(。我已经粘贴了我的整个代码。请看一下
    • 我已经编辑了我的答案,您正在将字符串转换为长字符串,因此您会收到此错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2014-12-18
    • 1970-01-01
    • 2020-10-03
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多