【问题标题】:android fragment interface nullpointerexceptionandroid片段接口nullpointerexception
【发布时间】:2015-09-06 16:50:24
【问题描述】:

我有两个片段,我想从第一个片段更新第二个片段TextView。我决定使用interface

public interface LogTextUpdater {
    void updateText(Information info);
}

这是我的第一个片段

public class UiFragment extends Fragment {
    public LogTextUpdater log;
    ...
    ...
    private void setInformationObject(String message){
        Information info = null;
        try {
            info = new XmlParser(message).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        if(info != null){
            log.updateText(info); // here I update second fragment TextView
        }
    }
}

这是我的第二个片段

public class LogFragment extends Fragment implements LogTextUpdater{

    private TextView logView;
    private UiFragment fragment;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment = new UiFragment();
        fragment.log = this; // register 
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_log, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        logView = (TextView) view.findViewById(R.id.textLog);
    }

    @Override
    public void updateText(Information info) {
        logView.setText(info.getName() + " " + info.getCity());
    }
}

这是我的MainActivity

public class MainActivity extends FragmentActivity {
 private PagerAdapter mPagerAdapter;

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

    private void initialisePaging() {
        List<Fragment> fragments = new Vector<>();
        fragments.add(Fragment.instantiate(this, UiFragment.class.getName()));
        fragments.add(Fragment.instantiate(this, LogFragment.class.getName()));
        mPagerAdapter = new PagerAdapter(getSupportFragmentManager(), fragments);
        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(mPagerAdapter);
    }
}

这是我的错误

java.lang.NullPointerException
            at carproject.hfad.com.carproject.UiFragment.setInformationObject(UiFragment.java:289)
            at carproject.hfad.com.carproject.UiFragment.sendCommand(UiFragment.java:313)
            at carproject.hfad.com.carproject.UiFragment.access$300(UiFragment.java:39)
            at carproject.hfad.com.carproject.UiFragment$1.onClick(UiFragment.java:125)
            at android.view.View.performClick(View.java:4654)
            at android.widget.CompoundButton.performClick(CompoundButton.java:104)
            at android.view.View$PerformClick.run(View.java:19438)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5602)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

调试后我发现log is null! 但为什么呢?我在LogFragment注册接口fragment.log = this; // register

【问题讨论】:

  • 在托管活动的帮助下完成片段到片段的通信。对托管活动进行回调,然后您可以将数据传递给第二个片段并在那里更新用户界面

标签: java android android-fragments interface nullpointerexception


【解决方案1】:

Fragmentfragment 的通信是不允许的。请查看official documentation。关键句:

您通常希望一个 Fragment 与另一个 Fragment 进行通信,例如根据用户事件更改内容。所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。

你应该怎么做

您的MainActivity 应该实现LogTextUpdater。然后在updateText 方法中,您应该找到LogFragment 并将Information 传递给它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多