Android 台灣中文網

標題: intent數值過去閃退? [打印本頁]

作者: gn02526721    時間: 2013-11-10 23:25
標題: intent數值過去閃退?
本帖最後由 gn02526721 於 2013-11-10 23:38 編輯

public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // TODO Auto-generated method stub
          listitemname=listtoread.getItemAtPosition(position).toString();
          itemintent=listitemname.substring(6,listitemname.length()-1);
            }}
          Wink;
因為我發現在點擊之後給定的名字會出現{name=XXX}這個樣子
所以我設定了抓取特定的字串來弄

readitem.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
          // TODO Auto-generated method stub
          Intent intent=new Intent();
          intent.setClass(readchoose.this, read.class);
          intent.putExtra("itemname", itemintent);
          startActivity(intent);
            }});

上面這是Intent的部分
我不大了解數值切換過去之後為何會閃退
我另外附上切換過去的JAVA檔吧

package com.example.LockInBrain;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class additem extends Activity {
        String addp,namep;
        TextView picuri=(TextView)findViewById(R.id.picuri);
        ImageView pic= (ImageView)findViewById(R.id.addpic);
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.additem);
               
                Intent intent = this.getIntent();
                //取得傳遞過來的資料  
                final String itemname = intent.getStringExtra("itemname");  
               
                ImageButton choosepic=(ImageButton) findViewById(R.id.choosepic);
                ImageButton addinto=(ImageButton) findViewById(R.id.addinto);
                final EditText picname=(EditText) findViewById(R.id.picname);
               
                picname.setText(itemname);
               
                choosepic.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                Intent intentpic = new Intent();  
                /* 开启Pictures画面Type设定为image */  
                intentpic.setType("image/*");  
                /* 使用Intent.ACTION_GET_CONTENT这个Action */  
                intentpic.setAction(Intent.ACTION_GET_CONTENT);   
                /* 取得相片后返回本画面 */
                startActivityForResult(intentpic, 1);  
                        }});
               
                addinto.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                String s2=picuri.getText().toString();
                                String s1=addp;
                                try{
                                FileWriter fw = new FileWriter("/sdcard/"+itemname+".txt", false);
                                BufferedWriter bw = new BufferedWriter(fw); //將BufferedWeiter與FileWrite物件做連結
                                bw.write("""+s1+"",""+s2+""");
                                bw.newLine();
                                bw.close();
                            }catch(IOException e){
                               e.printStackTrace();
                            }
                        }});
               
        }

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
               
                super.onActivityResult(requestCode, resultCode, data);
        // 有選擇檔案
        if ( resultCode == RESULT_OK )
        {   // 取得檔案的 Uri
            Uri uri = data.getData();
            if( uri != null )
            {   // 利用 Uri 顯示 ImageView 圖片
                pic.setImageURI( uri );
                picuri.setText( uri.toString() );
                addp=picuri.toString();
            }
            else
            {
                    picuri.setText("無效的檔案路徑 !!");
            }
        }
        else
        {
                picuri.setText("取消選擇檔案 !!");
        }
        }
       
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.title, menu);
                return true;
        }

}

additem.java

3.32 KB, 下載次數: 1, 下載積分: 碎鑽 -1 個


作者: lkk47    時間: 2013-11-10 23:25
我看到你程式有地方須修改  修改後試試看  因為你給的錯誤訊息不知道哪裡錯 你貼的程式碼  第22行TextView picuri=(TextView)findViewById(R.id.picuri); 這個全域變數改成TextView picuri;  
試試看行不行
作者: xjxuvup    時間: 2013-11-10 23:33
我建議你可以把logcat裡面紅色的部份貼出來
作者: gn02526721    時間: 2013-11-10 23:41
xjxuvup 發表於 2013-11-10 23:33
我建議你可以把logcat裡面紅色的部份貼出來

忘了可以貼LogCat的錯誤碼了
另外我程式碼有改動喔
幫我稍微看看
拜託了^^

11-10 10:39:56.864: E/AndroidRuntime(787): FATAL EXCEPTION: main
11-10 10:39:56.864: E/AndroidRuntime(787): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.LockInBrain/com.example.LockInBrain.additem}: java.lang.NullPointerException
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.os.Looper.loop(Looper.java:137)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread.main(ActivityThread.java:5103)
11-10 10:39:56.864: E/AndroidRuntime(787):         at java.lang.reflect.Method.invokeNative(Native Method)
11-10 10:39:56.864: E/AndroidRuntime(787):         at java.lang.reflect.Method.invoke(Method.java:525)
11-10 10:39:56.864: E/AndroidRuntime(787):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-10 10:39:56.864: E/AndroidRuntime(787):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-10 10:39:56.864: E/AndroidRuntime(787):         at dalvik.system.NativeStart.main(Native Method)
11-10 10:39:56.864: E/AndroidRuntime(787): Caused by: java.lang.NullPointerException
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.Activity.findViewById(Activity.java:1853)
11-10 10:39:56.864: E/AndroidRuntime(787):         at com.example.LockInBrain.additem.<init>(additem.java:22)
11-10 10:39:56.864: E/AndroidRuntime(787):         at java.lang.Class.newInstanceImpl(Native Method)
11-10 10:39:56.864: E/AndroidRuntime(787):         at java.lang.Class.newInstance(Class.java:1130)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
11-10 10:39:56.864: E/AndroidRuntime(787):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
11-10 10:39:56.864: E/AndroidRuntime(787):         ... 11 more

作者: lkk47    時間: 2013-11-11 10:57
使用bundle方式傳遞看看
作者: iamjason008    時間: 2013-11-11 11:18
//MainActivity.java
Intent intent = new Intent();
intent.putExtra("Type", 123);// ==>這裡的123你可以用數值或是boolean或是文字都可以,存跟取的時候型態要一致
intent.setClass(MainActivity.this, bbbb.class);
startActivity(intent);

//bbbb.java
Bundle bundle = this.getIntent().getExtras();
Int type = bundle.getInt("Type");
這樣應該就可以了~~~
作者: gn02526721    時間: 2013-11-11 11:41
本帖最後由 gn02526721 於 2013-11-11 11:44 編輯
iamjason008 發表於 2013-11-11 11:18
//MainActivity.java
Intent intent = new Intent();
intent.putExtra("Type", 123);// ==>這裡的123你可以 ...



我的是這樣
A.class
intent.setClass(readchoose.this, read.class);
          intent.putExtra("itemname", itemintent);
          startActivity(intent);
B.class
final String itemname = intent.getStringExtra("itemname");

傳送與接收都是一致的不是嗎
我想問一下怎麼會閃退
作者: iamjason008    時間: 2013-11-11 11:45
intent.putExtra("Type", Value);==>這裡的value可以是各種型態
只要接的那邊有對應到,就不會有什麼問題了
所以用intent.putExtra("Type", "TypeOne");//也是可以的
作者: gn02526721    時間: 2013-11-11 12:00
本帖最後由 gn02526721 於 2013-11-11 12:09 編輯
iamjason008 發表於 2013-11-11 11:45
intent.putExtra("Type", Value);==>這裡的value可以是各種型態
只要接的那邊有對應到,就不會有什麼問題了 ...


可是數值對應完完全全是一樣的
照理來說應該沒問題才對阿

還是說我B.class的地方應該改成
Bundle bundle = this.getIntent().getExtras();
final String itemname = bundle.getString("itemname");


???
作者: iamjason008    時間: 2013-11-11 12:16
在main存的時候用什麼型態,在b就用同樣的型態去接
所以後面用String去接是對的啊

會不會是你的listitemname,沒有抓到字串?!
作者: xjxuvup    時間: 2013-11-11 14:34
看你log好像是ui沒有宣告成功
你怎麼會在oncreate之前設定元件呢
養成好習慣
看是要寫一個function包起來
或者直接在onCreate裡面設定
作者: gn02526721    時間: 2013-11-11 16:19
iamjason008 發表於 2013-11-11 12:16
在main存的時候用什麼型態,在b就用同樣的型態去接
所以後面用String去接是對的啊

我有利用了Toast嘗試叫出來
是真的有抓到
作者: gn02526721    時間: 2013-11-11 16:20
xjxuvup 發表於 2013-11-11 14:34
看你log好像是ui沒有宣告成功
你怎麼會在oncreate之前設定元件呢
養成好習慣

function我不會做
也就是說我必須在onCreate那裡面才能宣告變數?
作者: iamjason008    時間: 2013-11-11 16:31
為啥存的時候是
          Intent intent=new Intent();
          intent.setClass(readchoose.this, read.class);
          intent.putExtra("itemname", itemintent);
          startActivity(intent);
取的時候會是在additem裡面啊?!

參考:http://cookiesp.pixnet.net/blog/post/84190702-android-intent%26bundle-%E5%82%B3%E9%81%9E%E8%B3%87%E6%96%99(%E5%8C%85%E5%90%AB%E5%82%B3%E9%81%9E%E8%87%AA%E5%AE%9A%E7%BE%A9%E7%89%A9
作者: iamjason008    時間: 2013-11-11 16:34
A.class(傳送資料)

//new一個intent物件,並指定Activity切換的class
Intent intent = new Intent();
intent.setClass(A.this,B.class);

intent .putExtra("name",name);//可放所有基本類別

//切換Activity
startActivity(intent);

B.class(接收資料)
Intent intent = this.getIntent();
//取得傳遞過來的資料   
String name = intent.getStringExtra("name");


我看你寫的,送的時候是read.class
但是收的時候是additem 這個class
作者: lkk47    時間: 2013-11-11 16:42
傳值建議使用這種方式
  1. A.class(傳送資料)

  2. ?
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. 11
  14. 12
  15. 13
  16. 14
  17. //new一個intent物件,並指定Activity切換的class
  18. Intent intent = new Intent();
  19. intent.setClass(A.this,B.class);

  20. //new一個Bundle物件,並將要傳遞的資料傳入
  21. Bundle bundle = new Bundle();
  22. bundle.putDouble("age",age );//傳遞Double
  23. bundle.putString("name",name);//傳遞String

  24. //將Bundle物件傳給intent
  25. intent.putExtras(bundle);

  26. //切換Activity
  27. startActivity(intent);


  28. B.class(接收資料)

  29. ?
  30. 1
  31. 2
  32. 3
  33. Bundle bundle = getIntent().getExtras();  
  34. String name = bundle.getString("name");
  35. double age = bundle.getDouble("age");
複製代碼

作者: gn02526721    時間: 2013-11-11 23:05
本帖最後由 gn02526721 於 2013-11-11 23:16 編輯

還是有問題
我利用Debug做測試
還是會閃退
以下是Debug跳出來的訊息

按圖鎖記 [Android Application]       
        DalvikVM[localhost:8642]       
                Thread [<1> main] (Suspended (exception RuntimeException))       
                        <VM does not provide monitor information>       
                        ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2137       
                        ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2261       
                        ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 141       
                        ActivityThread$H.handleMessage(Message) line: 1256       
                        ActivityThread$H(Handler).dispatchMessage(Message) line: 99       
                        Looper.loop() line: 137       
                        ActivityThread.main(String[]) line: 5103       
                        Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]       
                        Method.invoke(Object, Object...) line: 525       
                        ZygoteInit$MethodAndArgsCaller.run() line: 737       
                        ZygoteInit.main(String[]) line: 553       
                        NativeStart.main(String[]) line: not available [native method]       
                Thread [<10> Binder_2] (Running)       
                Thread [<9> Binder_1] (Running)       


  1. package com.example.LockInBrain;

  2. import java.io.BufferedWriter;
  3. import java.io.FileWriter;
  4. import java.io.IOException;

  5. import android.net.Uri;
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.view.Menu;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.ImageButton;
  15. import android.widget.ImageView;
  16. import android.widget.TextView;

  17. public class additem extends Activity {
  18.         String addp,namep;
  19.         TextView picuri=(TextView)findViewById(R.id.picuri);
  20.         ImageView pic= (ImageView)findViewById(R.id.addpic);
  21.         @Override
  22.         protected void onCreate(Bundle savedInstanceState) {
  23.                 super.onCreate(savedInstanceState);
  24.                 setContentView(R.layout.additem);
  25.                 final String addp = null;
  26.                 String namep;
  27.                 final TextView picuri=(TextView)findViewById(R.id.picuri);
  28.                 ImageView pic= (ImageView)findViewById(R.id.addpic);
  29.                 //Intent intent = this.getIntent();
  30.                 Bundle bundle = this.getIntent().getExtras();
  31.                 //取得傳遞過來的資料  
  32.                 final String itemname = bundle.getString("itemname");  
  33.                
  34.                 ImageButton choosepic=(ImageButton) findViewById(R.id.choosepic);
  35.                 ImageButton addinto=(ImageButton) findViewById(R.id.addinto);
  36.                 final EditText picname=(EditText) findViewById(R.id.picname);
  37.                
  38.                 picname.setText(itemname);
  39.                
  40.                 choosepic.setOnClickListener(new OnClickListener(){

  41.                         @Override
  42.                         public void onClick(View v) {
  43.                                 // TODO Auto-generated method stub
  44.                                 Intent intentpic = new Intent();  
  45.                 /* 开启Pictures画面Type设定为image */  
  46.                 intentpic.setType("image/*");  
  47.                 /* 使用Intent.ACTION_GET_CONTENT这个Action */  
  48.                 intentpic.setAction(Intent.ACTION_GET_CONTENT);   
  49.                 /* 取得相片后返回本画面 */
  50.                 startActivityForResult(intentpic, 1);  
  51.                         }});
  52.                
  53.                 addinto.setOnClickListener(new OnClickListener(){

  54.                         @Override
  55.                         public void onClick(View v) {
  56.                                 // TODO Auto-generated method stub
  57.                                 String s2=picuri.getText().toString();
  58.                                 String s1=addp;
  59.                                 try{
  60.                                 FileWriter fw = new FileWriter("/sdcard/"+itemname+".txt", false);
  61.                                 BufferedWriter bw = new BufferedWriter(fw); //將BufferedWeiter與FileWrite物件做連結
  62.                                 bw.write("""+s1+"",""+s2+""");
  63.                                 bw.newLine();
  64.                                 bw.close();
  65.                             }catch(IOException e){
  66.                                e.printStackTrace();
  67.                             }
  68.                         }});
  69.                
  70.         }

  71.         protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  72.                
  73.                 super.onActivityResult(requestCode, resultCode, data);
  74.         // 有選擇檔案
  75.         if ( resultCode == RESULT_OK )
  76.         {   // 取得檔案的 Uri
  77.             Uri uri = data.getData();
  78.             if( uri != null )
  79.             {   // 利用 Uri 顯示 ImageView 圖片
  80.                 pic.setImageURI( uri );
  81.                 picuri.setText( uri.toString() );
  82.                 addp=picuri.toString();
  83.             }
  84.             else
  85.             {
  86.                     picuri.setText("無效的檔案路徑 !!");
  87.             }
  88.         }
  89.         else
  90.         {
  91.                 picuri.setText("取消選擇檔案 !!");
  92.         }
  93.         }
  94.        
  95.         @Override
  96.         public boolean onCreateOptionsMenu(Menu menu) {
  97.                 // Inflate the menu; this adds items to the action bar if it is present.
  98.                 getMenuInflater().inflate(R.menu.title, menu);
  99.                 return true;
  100.         }

  101. }
複製代碼


再次確認Manifast那邊 確定肯定有加上Activity

補充問題:這2個分頁分別是第2個分頁和第3個分頁

也就是說我從第1頁切到第2頁沒問題
但是從第2頁切到第3頁卻有問題
作者: iamjason008    時間: 2013-11-12 10:21
如果照lkk大所說的,
在30行也要做對應的修改,把final TextView拿掉
23 跟31也要做相同的修改
作者: gn02526721    時間: 2013-11-12 11:19
lkk47 發表於 2013-11-12 09:53
我看到你程式有地方須修改  修改後試試看  因為你給的錯誤訊息不知道哪裡錯 你貼的程式碼  第22行TextView  ...

可以了
感謝你抓到重點
作者: gn02526721    時間: 2013-11-12 11:20
iamjason008 發表於 2013-11-12 10:21
如果照lkk大所說的,
在30行也要做對應的修改,把final TextView拿掉
23 跟31也要做相同的修改 ...

都改好
而且沒問題了
作者: gn02526721    時間: 2013-11-12 23:15
本帖最後由 gn02526721 於 2013-11-12 23:39 編輯

各位大大 我又發現一個問題了
就是寫入的地方無法寫入檔案耶
我確認過寫入我要的檔案
卻發現寫入的檔案出現在最一開始的資料夾中
而且顯示出來都只有第一行
請問如何讓他能夠寫完第一次資料後跳到下一行再繼續寫入?
另外為什麼我明明是抓了EditText內的文字
卻出現圖片中第一段的文字?
擷取.JPG
登錄/註冊後可看大圖