2013-10-30 83 views
1

我想用2個選項卡(選項卡A和選項卡B)製作一個Android應用程序,然後更新選項卡A的內容(TextView),但是在這種情況下會引發NullPointerException。這裏是我的代碼:NullPointerException setText Fragment

MainActivity.java

public class MainActivity extends ActionBarActivity { 

    TabA fragmentTabA = new TabA(); 
    TabB fragmentTabB = new TabB(); 

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

    public void addTabs() { 
     ActionBar actionBar = getSupportActionBar(); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.Tab tab1 = actionBar.newTab(); 
     tab1.setText("Tab A"); 
     tab1.setTabListener((ActionBar.TabListener) new TabsListener(fragmentTabA)); 

     ActionBar.Tab tab2 = actionBar.newTab(); 
     tab2.setText("Tab B"); 
     tab2.setTabListener((ActionBar.TabListener) new TabsListener(fragmentTabB)); 

     actionBar.addTab(tab1); 
     actionBar.addTab(tab2); 

     // I want to update the TextView of the tab A but NPE raises here 
     fragmentTabA.setTextView("Hello World !"); 
    } 
} 

TabA.java

public class TabA extends Fragment { 

    private TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.tab_a, container, false); 
     this.textView = (TextView) view.findViewById(R.id.textview_tab_a); 
     return view; 
    } 

    public void setTextView (String txt) { 
     this.textView.setText(txt); 
    } 
} 

TabsListener.java

public class TabsListener implements ActionBar.TabListener { 

    private Fragment fragment; 

    public TabsListener (Fragment fragment) { 
     this.fragment = fragment; 
    } 

    @Override 
    public void onTabSelected(Tab arg0, FragmentTransaction arg1) { 
     arg1.replace(R.id.tabs_container, this.fragment); 
    } 

    @Override 
    public void onTabUnselected(Tab arg0, FragmentTransaction arg1) { 
     arg1.remove(this.fragment); 
    } 

    @Override 
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) { 

    } 
} 

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/tabs_container" /> 

tab_a.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textview_tab_a" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 

logcat的

10-30 19:37:36.563: E/AndroidRuntime(4287): java.lang.RuntimeException: Unable to start 
activity ComponentInfo{com.example.actionbartest/com.example.actionbartest.MainActivity}: java.lang.NullPointerException 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.os.Looper.loop(Looper.java:137) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at dalvik.system.NativeStart.main(Native Method) 
10-30 19:37:36.563: E/AndroidRuntime(4287): Caused by: java.lang.NullPointerException 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at com.example.actionbartest.TabA.setTextView(TabA.java:22) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at com.example.actionbartest.MainActivity.addTabs(MainActivity.java:35) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at com.example.actionbartest.MainActivity.onCreate(MainActivity.java:15) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.Activity.performCreate(Activity.java:5133) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
10-30 19:37:36.563: E/AndroidRuntime(4287):  ... 11 more 

感謝您的幫助。

+0

在調用onCreateView之前調用setTextView方法。在您的分段生命週期的這一點上,您的textview將不會存在。 – dymmeh

回答

1

在標籤的onCreateView被調用之前,您似乎在上調用setTextView,因此您的setText失敗,因爲該選項卡尚未擴大其視圖。

確保只在視圖被充氣後才設置文字。 (因爲你似乎沒有使用任何類型的動態文本,你可以在onCreateView調用中自己設置文本)

相關問題