2014-10-19 34 views
1

我一直在嘗試從片段實例化的活動代碼片段佈局中的textView中設置文本。 我得到一個NullPointerException。這是幾天,不能解決它。在Activity中設置TextView片段

我嘗試了一些方法來將數據從活動傳遞到片段...... 1.)我首先在活動中添加了片段。然後嘗試在活動佈局中使用FindViewByID()訪問相應的textView(最初在片段佈局中)(假設它現在是我的活動的一部分)。我得到了NPE。 2.)我在我的Fragment類中創建了setter方法。然後我嘗試從活動類代碼中調用此方法。這也給NPE。

第2步代碼如下。請幫助我,我做錯了什麼。

活動代碼

public class DetailsActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_details); 
     // Show the Up button in the action bar. 
     setupActionBar(); 



     //attach fragment 
     Details_fragment detailsFrag = new Details_fragment(); //initializes any fragments that may be used 
     //data is coming from the previous activity 
     Intent intent = getIntent(); 
     NewsData temp = new NewsData(); 
     temp.setHeadline(intent.getStringExtra("headline")); 
     temp.setDetails(intent.getStringExtra("details")); 
     temp.setImage_source(intent.getIntExtra("img_source", 1)); 

     detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO 

     FragmentManager fManager = getFragmentManager(); //prepare fragment manager 
     FragmentTransaction fTransaction = fManager.beginTransaction(); 

     // Add fragments using fTransaction and then commit 
     fTransaction.add(R.id.details_activity_container, detailsFrag, "frag_tag"); 
     fTransaction.commit(); 

     //get data from intent 
     //set data in fragment views by using the setter of fragment 



    } 

} 

**錯誤是在這條線:** detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO 那就是當我評論了這一點,我的應用程序不會崩潰。 注意:我甚至試圖在提交碎片事務之後放置這些數據設置代碼行。同樣的錯誤NPE

片段代碼

public class Details_fragment extends Fragment { 

    NewsData display_data; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     display_data = new NewsData(); 
     View view = inflater.inflate(R.layout.details, container, false); 

     return view; 

    } 



    public NewsData getDisplay_data() { 
     return display_data; 
    } 


public void setDisplay_data(NewsData display_data) { 
     this.display_data = display_data; 

     TextView headline = (TextView) getView().findViewById(R.id.details_headline_view); 
     headline.setText(display_data.getHeadline()); 
     TextView detail = (TextView) getView().findViewById(R.id.details_details_view); 
     detail.setText(display_data.getDetails()); 
     ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view); 
     image_thumb.setImageResource(display_data.getImage_source()); 
    } 







    public void onAttach(Activity activity) { 

     super.onAttach(activity); 


    } 

} 

錯誤日誌

10-19 17:43:10.287: E/AndroidRuntime(9798): FATAL EXCEPTION: main 
10-19 17:43:10.287: E/AndroidRuntime(9798): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wasae.newsapp/com.wasae.newsapp.DetailsActivity}: java.lang.NullPointerException 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread.access$600(ActivityThread.java:150) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.os.Looper.loop(Looper.java:213) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread.main(ActivityThread.java:5225) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at dalvik.system.NativeStart.main(Native Method) 
10-19 17:43:10.287: E/AndroidRuntime(9798): Caused by: java.lang.NullPointerException 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at com.wasae.newsapp.Details_fragment.setDisplay_data(Details_fragment.java:37) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at com.wasae.newsapp.DetailsActivity.onCreate(DetailsActivity.java:35) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.Activity.performCreate(Activity.java:5133) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230) 
10-19 17:43:10.287: E/AndroidRuntime(9798):  ... 12 more 

UPDATE

後繼setArguments()方法,我仍然得到NPE

活動代碼

public class DetailsActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_details); 
     // Show the Up button in the action bar. 
     setupActionBar(); 



     //attach fragment 
     Details_fragment detailsFrag = new Details_fragment(); //initializes any fragments that may be used 

     Intent intent = getIntent(); 
     //SETTER METHOD - DOESNT WORK 
//  NewsData temp = new NewsData(); 
//  temp.setHeadline(intent.getStringExtra("headline")); 
//  temp.setDetails(intent.getStringExtra("details")); 
//  temp.setImage_source(intent.getIntExtra("img_source", 1)); 
//  detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO 

     Bundle dataBundle = new Bundle(); 
     dataBundle.putCharSequence("headline", intent.getStringExtra("headline")); 
     dataBundle.putCharSequence("details", intent.getStringExtra("details")); 
     dataBundle.putInt("img_source", intent.getIntExtra("img_source", 1)); 

     detailsFrag.setArguments(dataBundle); 

     FragmentManager fManager = getFragmentManager(); //prepare fragment manager 
     FragmentTransaction fTransaction = fManager.beginTransaction(); 

     // Add fragments using fTransaction and then commit 
     fTransaction.add(R.id.details_activity_container, detailsFrag, "frag_tag"); 
     //detailsFrag.setData(); 
     fTransaction.commit(); 

     //detailsFrag.setData(); 



    } 
} 

片段代碼

public class Details_fragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.details, container, false); 

     //get arguments 
     Bundle dataBundle = new Bundle(); 
     dataBundle = this.getArguments(); 

     TextView headline = (TextView) getView().findViewById(R.id.details_headline_view); 
     headline.setText(dataBundle.getString("headline")); 
     TextView detail = (TextView) getView().findViewById(R.id.details_details_view); 
     detail.setText(dataBundle.getString("details")); 
     ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view); 
     image_thumb.setImageResource(dataBundle.getInt("img_source")); 

     return view; 

    } 

// public void setData() { 
//  Bundle dataBundle = new Bundle(); 
//  dataBundle = this.getArguments(); 
//  
//  TextView headline = (TextView) getView().findViewById(R.id.details_headline_view); 
//  headline.setText(dataBundle.getString("headline")); 
//  TextView detail = (TextView) getView().findViewById(R.id.details_details_view); 
//  detail.setText(dataBundle.getString("details")); 
//  ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view); 
//  image_thumb.setImageResource(dataBundle.getInt("img_source")); 
// } 

    public void onAttach(Activity activity) { 

     super.onAttach(activity); 


    } 
} 

錯誤日誌

10-19 23:18:20.271: E/AndroidRuntime(29737): FATAL EXCEPTION: main 
10-19 23:18:20.271: E/AndroidRuntime(29737): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wasae.newsapp/com.wasae.newsapp.DetailsActivity}: java.lang.NullPointerException 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.access$600(ActivityThread.java:150) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.os.Looper.loop(Looper.java:213) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.main(ActivityThread.java:5225) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at java.lang.reflect.Method.invokeNative(Native Method) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at java.lang.reflect.Method.invoke(Method.java:525) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at dalvik.system.NativeStart.main(Native Method) 
10-19 23:18:20.271: E/AndroidRuntime(29737): Caused by: java.lang.NullPointerException 
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.wasae.newsapp.Details_fragment.onCreateView(Details_fragment.java:23) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.Fragment.performCreateView(Fragment.java:1699) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:889) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.BackStackRecord.run(BackStackRecord.java:682) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1443) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.Activity.performStart(Activity.java:5142) 
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2239) 
10-19 23:18:20.271: E/AndroidRuntime(29737): ... 12 more 

回答

3

問題是,當你撥打detailsFrag.setDisplay_data(temp); //ERRONEOUS TODOonCreateView還沒有被調用,並且getView返回null。你應該使用setArguments,提供你想要在你的片段中顯示的數據,並檢索那些與getArguments裏面,onCreateView例如

+0

我試過你說的話。這也給NPE :(它給NPE裏面onCreateView現在,我得到的參數線,並將其設置爲其中一個Textviews – 2014-10-19 14:13:32

+0

你可以更新您的問題與您正在使用的代碼 – Blackbelt 2014-10-19 14:46:05

+0

如何更新?我應該編輯我的問題並覆蓋它呢? – 2014-10-19 18:10:54