为什么 getFragmentManager().findFragmentById 返回 null(导致 NullPointerException)
Why is getFragmentManager().findFragmentById returning null (causing NullPointerException)
我有两个片段:输入在顶部,结果在底部。
最初,仅显示 InputFragment。当用户单击 "Calculate" 按钮时,将显示 ResultFragment。一切正常。
ResultFragment 有一个 "Clear all" 按钮,我想清除 InputFragment 的字段,并使 ResultFragment 消失(隐藏、删除或分离,我不关心哪个,只要它变成隐形)。
但是当您点击 "Clear all" 按钮时它会崩溃。具体来说,致命的 NullPointerException
发生在 clearResult() 方法中。
这里是MainActivity.java
import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity implements InputFragment.InputFragmentListener, ResultFragment.ResultFragmentListener {
private static FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState == null){
Fragment inputFragment = new InputFragment();
manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragment_container_top,inputFragment).commit();
}
}
//This gets called by the Input Fragment when the user clicks the Calculate button
@Override
public void createResult(String resultPhrase) {
ResultFragment resultFragment = (ResultFragment) manager.findFragmentById(R.id.result_fragment);
if (resultFragment != null){
/* if resultFragment is available, we can modify it's TextView
* by calling the method to do the updating
*/
//ResultFragment.theResultText.setText(resultPhrase);
resultFragment.setResultText(resultPhrase);
}else{
/*...otherwise the fragment has to be created */
ResultFragment newResultFragment = new ResultFragment();
Bundle args = new Bundle();
args.putString(ResultFragment.resultTxt, resultPhrase);
newResultFragment.setArguments(args);
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragment_container_bottom, newResultFragment);
transaction.addToBackStack(null);
transaction.commit();
//((TextView) newResultFragment.getView().get).setText(resultPhrase);
}
}
//This gets called in the ResultFragment when the user clicks the Clear All button
@Override
public void clearResult() {
//InputFragment inp_frag = (InputFragment) getFragmentManager().findFragmentById(R.id.fragment_input);
// This damned object is null again
//inp_frag.clearFields();
Fragment res_frag = getFragmentManager().findFragmentByTag("resultfragtag");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//res_frag.clearResult();
transaction.hide(res_frag);
transaction.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 true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
以下是 LogCat 条消息:
03-01 23:30:34.663: E/AndroidRuntime(3399): FATAL EXCEPTION: main
03-01 23:30:34.663: E/AndroidRuntime(3399): Process: com.example.amortizersandbox, PID: 3399
03-01 23:30:34.663: E/AndroidRuntime(3399): java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference
03-01 23:30:34.663: E/AndroidRuntime(3399): at android.app.BackStackRecord.run(BackStackRecord.java:797)
添加 InputFragment 时没有使用标签 "resultfragtag"。
尝试在创建时添加它:
transaction.add(R.id.fragment_container_top,inputFragment,"resultfragtag").commit();
replacing/adding 片段使用:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.slide_in_top,
R.anim.slide_out_top)
.add(R.id.list_frame, fr, "tag").commit();
现在查找此片段使用:
Fragment fr = getSupportFragmentManager()
.findFragmentByTag("tag");
if (fr != null) {
//do your stuff
} else {
//fr is null here
}
使用:
Fragment res_frag = getFragmentManager().findFragmentById(R.id.result_fragment);
替换:
Fragment res_frag = getFragmentManager().findFragmentByTag("resultfragtag");
我有两个片段:输入在顶部,结果在底部。
最初,仅显示 InputFragment。当用户单击 "Calculate" 按钮时,将显示 ResultFragment。一切正常。
ResultFragment 有一个 "Clear all" 按钮,我想清除 InputFragment 的字段,并使 ResultFragment 消失(隐藏、删除或分离,我不关心哪个,只要它变成隐形)。
但是当您点击 "Clear all" 按钮时它会崩溃。具体来说,致命的 NullPointerException
发生在 clearResult() 方法中。
这里是MainActivity.java
import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity implements InputFragment.InputFragmentListener, ResultFragment.ResultFragmentListener {
private static FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState == null){
Fragment inputFragment = new InputFragment();
manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragment_container_top,inputFragment).commit();
}
}
//This gets called by the Input Fragment when the user clicks the Calculate button
@Override
public void createResult(String resultPhrase) {
ResultFragment resultFragment = (ResultFragment) manager.findFragmentById(R.id.result_fragment);
if (resultFragment != null){
/* if resultFragment is available, we can modify it's TextView
* by calling the method to do the updating
*/
//ResultFragment.theResultText.setText(resultPhrase);
resultFragment.setResultText(resultPhrase);
}else{
/*...otherwise the fragment has to be created */
ResultFragment newResultFragment = new ResultFragment();
Bundle args = new Bundle();
args.putString(ResultFragment.resultTxt, resultPhrase);
newResultFragment.setArguments(args);
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragment_container_bottom, newResultFragment);
transaction.addToBackStack(null);
transaction.commit();
//((TextView) newResultFragment.getView().get).setText(resultPhrase);
}
}
//This gets called in the ResultFragment when the user clicks the Clear All button
@Override
public void clearResult() {
//InputFragment inp_frag = (InputFragment) getFragmentManager().findFragmentById(R.id.fragment_input);
// This damned object is null again
//inp_frag.clearFields();
Fragment res_frag = getFragmentManager().findFragmentByTag("resultfragtag");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//res_frag.clearResult();
transaction.hide(res_frag);
transaction.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 true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
以下是 LogCat 条消息:
03-01 23:30:34.663: E/AndroidRuntime(3399): FATAL EXCEPTION: main
03-01 23:30:34.663: E/AndroidRuntime(3399): Process: com.example.amortizersandbox, PID: 3399
03-01 23:30:34.663: E/AndroidRuntime(3399): java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference
03-01 23:30:34.663: E/AndroidRuntime(3399): at android.app.BackStackRecord.run(BackStackRecord.java:797)
添加 InputFragment 时没有使用标签 "resultfragtag"。
尝试在创建时添加它:
transaction.add(R.id.fragment_container_top,inputFragment,"resultfragtag").commit();
replacing/adding 片段使用:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.slide_in_top,
R.anim.slide_out_top)
.add(R.id.list_frame, fr, "tag").commit();
现在查找此片段使用:
Fragment fr = getSupportFragmentManager()
.findFragmentByTag("tag");
if (fr != null) {
//do your stuff
} else {
//fr is null here
}
使用:
Fragment res_frag = getFragmentManager().findFragmentById(R.id.result_fragment);
替换:
Fragment res_frag = getFragmentManager().findFragmentByTag("resultfragtag");