java - 更新 TabLayout 中的 TextView 导致 NullPointerException

标签 java android android-fragments nullpointerexception android-tablayout

我正在尝试创建一个具有 3 个选项卡的应用程序,每个选项卡代表我从另一台设备接收的数据。我每 5 分钟左右收到一次此数据,因此我需要选项卡中的文本不断更改。但是,我在更新选项卡中的 TextView 以匹配最新传入数据时遇到问题,因为它会导致 NullPointerException。以下是存在问题的主要 Activity :

public class PlantStatsActivity extends FragmentActivity {

public DrawerLayout mDrawerLayout;
public ListView mDrawerList;
private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPageAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_plant_stats);
    initPubNub();


    tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Moisture"));
    tabLayout.addTab(tabLayout.newTab().setText("Light"));
    tabLayout.addTab(tabLayout.newTab().setText("Temperature"));

    viewPager = (ViewPager) findViewById(R.id.pager);
    adapter = new ViewPageAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

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

        }

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

        }
    });

    LightFragment lightFragment = (LightFragment) adapter.getItem(1);
    lightFragment.setLightText("Test"); //This is where the problem lies.
}

我收到 NullPointerException,因为字段 lightText 为空(目前我只是想让它在“Light”选项卡上工作)。

这是我试图在 Activity 中更新的 TextView fragment

public class LightFragment extends Fragment {
    private int lightLevel;
    private TextView lightText;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment_light, container, false);
        lightText = (TextView) v.findViewById(R.id.current_level_light);
        return v;
    }

    public int getLightLevel() {
        return lightLevel;
    }

    public void setLightLevel(int newLightLevel){
        lightLevel = newLightLevel;
    }

    public TextView getLightText() {
        return lightText;
    }

    public void setLightText(String newText) {
        lightText.setText(newText); //Method used in activity causing crash.
    }

}

我包括 ViewPageAdapter 类:

public class ViewPageAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public ViewPageAdapter(FragmentManager fm, int numOfTabs){
        super(fm);
        this.mNumOfTabs = numOfTabs;
    }

    @Override
    public Fragment getItem(int position){
        switch (position){
            case 0:
                MoistureFragment tab1 = new MoistureFragment();
                return tab1;
            case 1:
                LightFragment tab2 = new LightFragment();
                return tab2;
            case 2:
                TemperatureFragment tab3 = new TemperatureFragment();
                return tab3;
            default:
                return null;
        }
    }

    @Override
    public int getCount(){
        return mNumOfTabs;
    }

}

显示接收和处理数据过程的代码,它是一个 JSON 对象,存储我感兴趣的 int 值。在主 Activity 开始时调用。

public void initPubNub(){
    PNConfiguration pnConfiguration = new PNConfiguration();
    pnConfiguration.setPublishKey(PUBLISH_KEY);
    pnConfiguration.setSubscribeKey(SUBSCRIBE_KEY);
    pnConfiguration.setUuid("AndroidPiLight");
    mPubNub = new PubNub(pnConfiguration);
    mPubNub.subscribe().channels(Arrays.asList(CHANNEL)).execute();
    Log.d(TAG, "subscribed");

    mPubNub.addListener(new SubscribeCallback() {
        @Override
        public void status(PubNub pubnub, PNStatus status) {
            // handle any status
        }

        @Override
        public void message(PubNub pubnub, PNMessageResult message) {
            JsonNode lightNode = message.getMessage().findValue("lightValue"); // "lightValue" is JSON key.
            int newLight = lightNode.asInt();
            Log.d(TAG, "Got message as int");
            Bundle data = new Bundle();
            data.putInt("lightMessage", newLight);
            Message message1 = new Message();
            message1.setData(data);
            android.os.Handler handler = LightFragment.sUpdateHandler;
            if (handler != null){
                handler.sendMessage(message1);
            }

我是 Android 初学者,所以我不确定我是否在应用程序中做错了什么,或者我是否需要添加一些完全不同的东西才能完成这项工作。我彻底浏览了 Stack Overflow 之前的问题,但找不到任何答案。这是我在 Stack Exchange 上的第一个问题,真诚感谢任何反馈。

最佳答案

在您的寻呼机适配器类中尝试执行此操作

       LightFragment tab2 = new LightFragment();
        Bundle data = new Bundle();
        data.putInt("current_page", "id");
        data.putString("current_id","" );
        data.putInt("sub_cat_id","");
        myFragment.setArguments(data);

然后在您的 LightFragment 类 onCreate 中获取此 bundle 值

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

    /** Getting the arguments to the Bundle object */
    Bundle data = getArguments();

    /** Getting integer data of the key current_page from the bundle */
    mCurrentPage = data.getInt("current_page", 0);

    }

关于java - 更新 TabLayout 中的 TextView 导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38092040/

相关文章:

java - Jedis ClassNotFound 和 NoClassDefFoundError

java - 如何使用 xquery 在 java 中处理非常大的 xml 文件,如 150mb

Java 8 : removing duplicate after addall twice, 可能存在并发问题?

java - 底部工作表未按预期展开

java - 膨胀类 ImageView 和 ImageButton 时出错

android - 操作栏按钮未显示在 fragment 中

Java 泛型作为方法的参数

android - 如何在 ActionBar 中同时显示图标和 Action 标题?

Android onTaskRemoved() 调用网络服务

java - 从 WebView 中获取 Fragment 的实例