【问题标题】:Fragment NullPointerException, Changing fragment textView's text from activity片段 NullPointerException,从活动中更改片段 textView 的文本
【发布时间】:2016-03-16 12:23:28
【问题描述】:

我的 android 项目有问题。我正在使用 Datamap 将数据发送到我的穿戴。我有一个数据监听器,用于在磨损主要活动中获取数据。

基本上我想从活动中更改片段的 textView 文本。当我尝试这样做时,它失败了,我得到了--> NullPointerException。我该如何解决?

是因为我在 mainactivity 的 onCreate 方法中调用了片段吗?

MainActivity xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</android.support.v4.view.ViewPager>

主要活动

public class MainActivity extends FragmentActivity {

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

        viewpager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fm = getSupportFragmentManager();
        viewpager.setAdapter(new FragmentAdapter(fm));

        dataListener = new DataApi. DataListener() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onDataChanged(DataEventBuffer dataEvents) {
                final ArrayList<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
                DataMap mediaMap;
                DataMap updateMap;
                for (DataEvent event : events) {
                    PutDataMapRequest putDataMapRequest =
                            PutDataMapRequest.createFromDataMapItem(DataMapItem.fromDataItem(event.getDataItem()));

                    if (event.getType() == DataEvent.TYPE_CHANGED) {
                        if (event.getDataItem().getUri().getPath().equals("/myPath")) {
                            dataMap= DataMapItem.fromDataItem(event.getDataItem()).getDataMap();

                            FragmentA fragment = (MainControlScreenFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentA);

}
}

【问题讨论】:

  • 请发布您的整个MainActivity.class 和它的xml 文件。
  • 如果我理解正确,您想从MainActivity 调用方法到MainControlScreenFragment 以在片段中设置一些文本。我说的对吗?
  • 是的,你是对的!
  • 我有类似的问题,希望有人能帮助。
  • 如果DataListener 的目的是更新Fragment 中的文本,为什么不把它放在Fragment 本身,而不是放在Activity 中呢?看起来它通常是一个更合乎逻辑的结构,并且可以避免任何需要调用 findFragmentById - 这似乎是您的问题所在(您实际上并没有指定 NPE 被抛出的位置)。

标签: android android-layout android-fragments wear-os android-wear-data-api


【解决方案1】:

在您的片段中进行单吨实现,在 onCreateView() 方法上方的 MainControlScreenFragment.class 中添加以下行:

private static MainControlScreenFragment instance;

public MainControlScreenFragment() {
}

/**
 * Static method which return the instance of the fragment. If the fragment is null, load it,
 * else create new fragment. Singleton pattern.
 *
 * @return
 */
public static MainControlScreenFragment getInstance() {
    if (instance == null) {
        instance = new MainControlScreenFragment();

    }

    return instance;
}

之后在您的活动中调用MainControlScreenFragment.getInstance().changeTextMethod(); 而不是MainControlScreenFragment fragment = (MainControlScreenFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentA);

请注意,您的 changeTextMethod() 应在 MainControlScreenFragment.class 中声明为 public

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多