2013-10-09 70 views
1

我嘗試了一些提交給堆棧溢出的解決方案,但目前爲止還沒有人幫助我。在另一個調用父活動的片段中觸發按鈕偵聽器時會發生此問題。父活動調用這個片段updateValue()方法(見下文)。在onCreateView()從我的片段,我有以下代碼:在onCreateView之後TextView爲null:nullpointerexception

Result.class延伸片段

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.result, container, false);   
    resultTV = (TextView)view.findViewById(R.id.resultTV); 
    resultTV.setText(resultTV.getText().toString() + "test!"); 
    return view; 
} 

這工作完全。但是,當我打電話的片段的方法從父活動textview引用爲空(空指針異常)。發生異常時調用resultTV.setText()

public void updateValue(View v) { 
    String text = ((Button)v).getText().toString(); 

    if(text.toLowerCase() == "c") resultTV.setText(DEFAULT_RESULT_TEXT); 
    else resultTV.setText(resultTV.getText().toString() + text); 
} 

異常

10-09 16:32:59.091: E/AndroidRuntime(2324): FATAL EXCEPTION: main 
10-09 16:32:59.091: E/AndroidRuntime(2324): java.lang.NullPointerException 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at com.test.Result.updateValue(Result.java:53) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at com.test.Main.onBasicButtonClicked(Main.java:65) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at com.test.Basic$7.onClick(Basic.java:120) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.view.View.performClick(View.java:4240) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.view.View$PerformClick.run(View.java:17721) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.os.Handler.handleCallback(Handler.java:730) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.os.Looper.loop(Looper.java:137) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-09 16:32:59.091: E/AndroidRuntime(2324):  at dalvik.system.NativeStart.main(Native Method) 

編輯:

主要有幾個片段:basicscientific片段是簡單的按鈕。 matrix片段尚未使用,因此我們可以忽略該片段。 result片段是發現問題TextView的地方。

Main.class(主要業務類)

public class Main extends Activity implements 
OnBasicButtonClickedListener, 
OnScientificButtonClickedListener, 
OnMatrixButtonClickedListener { 

private FragmentManager  fm = getFragmentManager(); 
private FragmentTransaction ft = fm.beginTransaction(); 
private Basic    basic = new Basic(); 
private Scientific   scientific = new Scientific(); 
private Result    result = new Result(); 
private MatrixFragment  matrixFrag = new MatrixFragment(); 
private static final String LOG = "Main.class"; 

/* this list view will hold all submitted formulas */ 
private ListView formulaLV; 

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

    if(findViewById(R.id.result) == null) 
     ft.add(R.id.result, result); 

    if(findViewById(R.id.basic) == null) 
     ft.add(R.id.basic, basic); 

    if(findViewById(R.id.scientific) == null) 
     ft.add(R.id.scientific, scientific); 

    if(findViewById(R.id.matrix) == null) 
     ft.add(R.id.matrix, matrixFrag); 
    ft.commit();   
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return false; 
} 

/* 
* This method acts as a listener for fragment to fragment communication 
* from Basic fragment. 
*/ 
public void onBasicButtonClicked(View v) { 
    Log.i(LOG, ((Button)v).getText() + " button pressed!"); 
    result.updateValue(v); 
} 

/* 
* This method acts as a listener for fragment to fragment communication 
* from Scientific fragment. 
*/ 
public void onScientificButtonClicked(View v) { 
    Log.i(LOG, ((Button)v).getText() + " button pressed!"); 
    result.updateValue(v); 
} 

@Override 
public void matrixButtonClicked(View view) { 
    // matrix button clicked 

} 

}

+1

在調用'updateValue()'之前,你確定調用了'onCreateView()'嗎? – lub0v

+1

爲什麼您將視圖從活動傳遞到片段?你不應該這樣做。 – SBerg413

+0

'resultTV'看起來是來自Activity類的一個變量,而在Fragment中有另一個類變量。但是這兩個是不同的,難怪你得到這個例外。 – gunar

回答

3

空指針可能是因爲resultTV沒有顯示到updateValue()方法。你如何在片段類中聲明resultTV?你可能會想嘗試它聲明爲靜態的,如果你要來實例化類的多個實例,你希望它保持不變,隨着時間的推移

您也可能想嘗試

TextView resultTV = (TextView)view.findViewById(R.id.resultTV); 

updateValue方法

+2

將'resultTV'聲明爲'static'將意味着創建的任何附加片段將更新對_their_' resultTV的引用' - 所以FragmentA會在'updateValue'方法中更新FragmentB的文本視圖。噢親愛的。 –

+0

他們在同一個班級,所以他們應該一定能夠訪問對方。只有一個實例。 – TaserPain

+0

使'resultTV'靜態解決問題。 'private static TextView resultTV =(TextView)view.findViewById(R.id.resultTV);' – TaserPain

相關問題