【问题标题】:Android: Can't update textview in Fragment from Activity. NullPointerExceptionAndroid:无法从 Activity 更新 Fragment 中的 textview。空指针异常
【发布时间】:2016-04-25 05:33:44
【问题描述】:

我正在尝试从另一个活动更新片段中的文本视图。但是在调用 setText 方法时我得到了一个 NUllPointerException 。我尝试了以下方法,但仍然获得了 NPE。 1. 尝试在活动中使用 FindViewbyId 访问片段文本视图。 2.尝试使用片段中的方法并从活动中调用它并将值作为参数传递

FragHome 活动

public class FragHome extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

Handler bluetoothIn;
private static TextView tmpF, humF, CoF;
String tempGL, HumGL, coGL, devname;
double dblTemp, dblCo;
final int handlerState = 0; // used to identify handler message
private BluetoothAdapter btAdapter = null;
private TabLayout tabLayout;
private ViewPager viewPager;

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

    //Adding toolbar to the activity
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //Initializing the tablayout
    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    //Initializing viewPager
    viewPager = (ViewPager) findViewById(R.id.pager);
    //Adding the tabs using addTab() method
    tabLayout.addTab(tabLayout.newTab().setText("Temperature"));
    tabLayout.addTab(tabLayout.newTab().setText("Humidity"));
    tabLayout.addTab(tabLayout.newTab().setText("CO"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    //Creating our pager adapter
    Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount());

    //Adding adapter to pager
    viewPager.setAdapter(adapter);
    viewPager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    //Adding onTabSelectedListener to swipe views
    tabLayout.setOnTabSelectedListener(this);

    bluetoothIn=new Handler() {

        String readMessage;
        String[] values = new String[]{""};

        public void handleMessage(android.os.Message msg) {

            if (msg.what == handlerState) {

                readMessage = (String) msg.obj;
                values = readMessage.split("#");
                for (int j = 0; j < values.length; j++) {

                    int rem = j % 3;

                    if (rem == 0) {

                        tmpF.setText(values[j] + " C");
                        tempGL = String.valueOf(values[j]);

                        try {
                            dblTemp = Double.parseDouble(tempGL);
                        } catch (NumberFormatException e) {
                            e.printStackTrace();
                        }

                    } else if (rem == 1) {

                        CoF.setText(values[j] + " ppm");
                        coGL = values[j];
                        try {
                            dblCo = Double.parseDouble(coGL);
                        } catch (NumberFormatException e) {
                            e.printStackTrace();
                        }

                    } else if (rem == 2) {
                        humF.setText(values[j] + " %");
                        HumGL = values[j];
                    }
                }
            }
        }
    };

    btAdapter=BluetoothAdapter.getDefaultAdapter(); // get Bluetooth
}

@Override
public void onTabSelected(TabLayout.Tab tab) {
    // mViewPager.setCurrentItem(tab.getPosition());

}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}
}

寻呼机

  public class Pager extends FragmentStatePagerAdapter {

//integer to count number of tabs
int tabCount;

//Constructor to the class
public Pager(FragmentManager fm, int tabCount) {
    super(fm);
    //Initializing tab count
    this.tabCount= tabCount;
}

//Overriding method getItem
@Override
public Fragment getItem(int position) {
    //Returning the current tabs
    switch (position) {
        case 0:
            Tab1 tab1 = new Tab1();
            return tab1;
        case 1:
            Tab2 tab2 = new Tab2();
            return tab2;
        case 2:
            Tab3 tab3 = new Tab3();
            return tab3;
        default:
            return null;
    }
}

//Overriden method getCount to get the number of tabs
@Override
public int getCount() {
    return tabCount;
}
}

Tab1

public class OneFragment extends Fragment {

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

}
}

fragment_one.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="shinil.tablayout.OneFragment"
android:id="@+id/rltnvnv">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Temperature"
    android:textSize="40dp"
    android:textStyle="bold"
    android:id="@+id/textviewtemp"
    android:layout_centerInParent="true"/>

 </RelativeLayout>

frag_home.xml

 LinearLayout
android:id="@+id/main_layout"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<!-- our toolbar -->
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

<!-- our tablayout to display tabs  -->
<android.support.design.widget.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"

    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

<!-- View pager to swipe views -->
<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"/>

  </LinearLayout>    

当我尝试从活动中设置文本时发生 NPE。请帮忙

【问题讨论】:

  • 我收到“未找到您的姓名异常”
  • 你在哪里初始化了textView。您应该在设置文本之前对其进行初始化。使用 findViewById(R.id.textviewtemp); 对其进行初始化;
  • 并且该 textView 存在于片段 xml 中,但您正尝试在活动中使用它。那总是会给NPE。
  • 我只在这里发布了我的部分代码。我已经尝试初始化文本视图,但仍然得到 NPE。
  • 还有其他方法可以从我的 onhandlemessage 方法更新片段 textview 吗?

标签: android android-fragments nullpointerexception textview settext


【解决方案1】:

使用下面的回调:

片段类:

public class FragmentOne extends Fragment {


private ViewCallback mCallback;

 public FragmentOne(ViewCallback mCallback) {
    this.mCallback = mCallback;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_one, container, false);
    mCallback.updateTextView((TextView) view.findViewById(R.id.fragmentTextView));
    return view;
}

public interface ViewCallback {
    void updateTextView(TextView view);
}
}

下面是Activity类:

public class MainCallbackActivity extends Activity implements CallbackFragment.ViewCallback {

public TextView textView;

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

    FragmentOne fragment = new FragmentOne(this);
    getFragmentManager().beginTransaction().add(R.id.frameLayout, fragment).commit();

}

@Override
protected void onResume() {
    super.onResume();
    if (textView != null)
        textView.setText("Updating Fragment TextView in Activity..!!");
}

@Override
public void updateTextView(TextView view) {
    this.textView = view;
}
}

在您的活动类中实现回调。然后更新文本视图。

【讨论】:

  • 仍然出现错误。你能告诉我如何使用它吗?
  • 你在哪里添加片段到活动?
  • 一个很好的答案,它的工作原理。但仍然没有解决我的问题。文本视图显示在所有三个选项卡中。
  • 更改标签时使其不可见。
  • 我正在使用标签布局。每个选项卡都是一个片段。我使用活动来更新所有三个选项卡中的文本视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多