Android:在片段之间进行通信时发生NullPointerException

时间:2015-02-04 19:45:37

标签: android android-fragments

Android新手在这里。尝试将文本从一个片段发送到另一个片段时,我的应用程序崩溃了。它说:

java.lang.NullPointerException
            at com.example.hang.camera.Camera.sendResults(Camera.java:57)
            at com.example.hang.camera.PageOneFragment.sendMethod(PageOneFragment.java:320)
            at com.example.hang.camera.PageOneFragment$1.onClick(PageOneFragment.java:104)

这是我的代码:

//从片段A

实现接口的活动

Camera.java:

public class Camera extends ActionBarActivity implements PageOneFragment.OnComputeResultListener{

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

    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mViewPager = (CustomViewPager)findViewById(R.id.pager);
    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

    mTabsAdapter.addTab(mTabHost.newTabSpec("one").setIndicator("One"), PageOneFragment.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("two").setIndicator("Two"), PageTwoFragment.class, null);

    if (savedInstanceState != null)
    {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }

    mViewPager.setPagingEnabled(false);

}

@Override
public void sendResults(String text){
    PageTwoFragment fragmentTwo =     (PageTwoFragment)getSupportFragmentManager().findFragmentById(R.id.second_fragment);
    fragmentTwo.updateText(text);
}

//片段A:

PageOneFragment.java

OnComputeResultListener mCallback;
public interface OnComputeResultListener{
    public void sendResults(String text);
}

@Override
public void onAttach(Activity activity)
{
    super.onAttach(activity);

    try{
        mCallback = (OnComputeResultListener) activity;
    } catch(ClassCastException e){
        throw new ClassCastException(activity.toString()
                + " must implement OnComputeResultListener");
    }
}

public void sendMethod(){
    mCallback.sendResults("the results");
}

// in onCreateView, I have this onclicklistener, and I call "sendMethod" here 
lengthButton.setOnClickListener(
            new Button.OnClickListener(){
                public void onClick(View v){

                    double length ;
                    line_x = imageview.x_getter();
                    line_y = imageview.y_getter();

                    length = Math.sqrt(Math.pow((line_x[0]-line_x[1]),2) + Math.pow((line_y[0]-line_y[1]),2));

                    line_length.setText("Length of the line is: " + String.format("%.2f",length) + "dp");

                    sendMethod();

                }
            }
    );

//片段B PageTwoFragment.java

private TextView resultText = null;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.pagetwo_fragment, container, false);

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

    return view;
}

public void updateText(String text){
    resultText.setText(text);
}

2 个答案:

答案 0 :(得分:2)

我终于解决了这个问题。在我实现的camera.java中" sendResults"接口的方法,我改变了参数" findFragmentById"到viewPager的id而不是片段的xml文件的id。

但是,从Android开发者doc,对于findFragmentById,它确实说:

Finds a fragment that was identified by the given id either when inflated from XML or as the container ID when added in a transaction.

所以,我不知道为什么xml id不起作用。

答案 1 :(得分:1)

您可以将Fragment保存为Activity类中的对象。 在执行片段事务之前的activity类中,执行以下操作:

 PageTwoFragment fragmentTwo = new  PageTwoFragment();
 // do the transaction:
FragmentTransaction ft = fm.beginTransaction();          
ft.replace(R.id.container, fragmentTwo);
ft.commit();

然后在代码中,只需调用

fragmentTwo.updateText(...);