2012-12-30 36 views
0

我试图通过单个选项列表视图片段将一些数据从我的ListView发送到另一个活动。 这里是数据流应该如何:在活动和片段之间传递包值时应用程序崩溃

ListView(在选择一个选项时) - >单选项列表视图片段(同样,在选择一个选项时) - > AnotherActivity。从ListView中发送该数据到碎片

代码:

Bundle b = new Bundle(); 
b.putString("id", str_projectid); 
Projectviewoptions pv = new Projectviewoptions(); 
pv.setArguments(b); 

Projectviewoptions newFragment = new Projectviewoptions(); 
newFragment.show(getFragmentManager(), "projectoptions"); 
,其接收的数据,然后将其发送到其他活动

代码片段类:

public class Projectviewoptions extends DialogFragment { 

String[] option_array = new String[] {"Project details","Edit","Delete","Mark Done"}; 
Bundle idbundle = getArguments(); 
String myid= idbundle.getString("id"); 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("Options") 
      .setItems(option_array, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

       switch(which) { 

       case 0: Intent intent = new Intent(getActivity(),ViewProjectDetails.class); 
         intent.putExtra("id", myid); 
         startActivity(intent); 
         break; 




       } 

      } 
    }); 
    return builder.create(); 
} 
} 

代码在OtherActivity其中接收片段传递的数据:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_project_details); 

    String id = getIntent().getExtras().getString("id"); 
    Toast.makeText(this, id, Toast.LENGTH_LONG).show(); 
} 

问题: 当我从ListView中选择一个选项时,应用程序崩溃。如果我删除处理数据传递的代码,该应用程序工作正常。 也就是说,如果你删除在ListView下面的代码:

/*Bundle b = new Bundle(); 
     b.putString("id", str_projectid); 
     Projectviewoptions pv = new Projectviewoptions(); 
     pv.setArguments(b);*/ 

及以下,在片段等级:

//Bundle idbundle = getArguments(); 
//String myid= idbundle.getString("id"); 

这里是logcat的:

12-30 23:21:09.620: W/dalvikvm(7406): threadid=1: thread exiting with uncaught 
exception (group=0x409c01f8) 
12-30 23:21:09.653: E/AndroidRuntime(7406): FATAL EXCEPTION: main 
12-30 23:21:09.653: E/AndroidRuntime(7406): java.lang.NullPointerException 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at  
com.kk.project.Projectviewoptions.<init>(Projectviewoptions.java:14) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
com.kk.project.ProjectExplorer.onListItemClick(ProjectExplorer.java:53) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.app.ListActivity$2.onItemClick(ListActivity.java:319) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.widget.AdapterView.performItemClick(AdapterView.java:292) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at  
android.widget.AbsListView.performItemClick(AbsListView.java:1058) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.widget.AbsListView$PerformClick.run(AbsListView.java:2514) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.widget.AbsListView$1.run(AbsListView.java:3168) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.os.Handler.handleCallback(Handler.java:605) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.os.Handler.dispatchMessage(Handler.java:92) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at  
android.os.Looper.loop(Looper.java:137) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
android.app.ActivityThread.main(ActivityThread.java:4424) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
java.lang.reflect.Method.invokeNative(Native Method) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
java.lang.reflect.Method.invoke(Method.java:511) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-30 23:21:09.653: E/AndroidRuntime(7406):  at  
dalvik.system.NativeStart.main(Native Method) 

回答

3

你不能访问碎片的任何方法之外的论点,只需将此代码移动到onCreateDialog()

Bundle idbundle; 
String myid; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    idbundle = getArguments(); 
    myid = idbundle.getString("id"); 
    ... 

问题是当您在片段的生命周期开始前尝试访问它时,getArguments();返回null,因此idbundle.getString()是NPE。


加成
你正在创建一个名为pvnewFragment相同片段的两个不同的副本,你应该表现出pv和删除newFragment完全:

Bundle b = new Bundle(); 
b.putString("id", str_projectid); 
Projectviewoptions pv = new Projectviewoptions(); 
pv.setArguments(b); 
pv.show(getFragmentManager(), "projectoptions"); 

Projectviewoptions newFragment = new Projectviewoptions(); 
newFragment.show(getFragmentManager(), "projectoptions"); 

+0

我做到了,但它仍然给与NPE同样的问题。 –

+0

我插入了'idbundle = getArguments(); myid = idbundle.getString(“id”);'在onClick和片段出现。但选择该选项后,该应用程序崩溃。这是相同的NPE错误,我认为解决方案与您的解决方案类似,但无法找到答案。 –

+1

对不起,我错过了你正在创建你的Fragment的_two_副本。你添加了Bundle到一个,但开始另一个...我更新了我的答案。 – Sam

相关问题