Java 更新TableLayout中的TextView会导致NullPointerException
我正在尝试创建一个包含3个选项卡的应用程序,每个选项卡表示我从另一台设备接收的数据。我大约每5分钟收到一次数据,所以我需要标签中的文本不断变化。但是,我在更新选项卡中的TextView以匹配最新传入数据时遇到问题,因为它会导致NullPointerException。以下是问题所在的主要活动:Java 更新TableLayout中的TextView会导致NullPointerException,java,android,android-fragments,nullpointerexception,android-tablayout,Java,Android,Android Fragments,Nullpointerexception,Android Tablayout,我正在尝试创建一个包含3个选项卡的应用程序,每个选项卡表示我从另一台设备接收的数据。我大约每5分钟收到一次数据,所以我需要标签中的文本不断变化。但是,我在更新选项卡中的TextView以匹配最新传入数据时遇到问题,因为它会导致NullPointerException。以下是问题所在的主要活动: public class PlantStatsActivity extends FragmentActivity { public DrawerLayout mDrawerLayout; public
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
为null(我现在只是想让它在“Light”选项卡上工作)
这是我试图在活动中更新的文本视图的片段
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;
}
}
显示接收和处理数据过程的代码,数据是存储我感兴趣的int值的JSON对象。在主要活动开始时调用
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的初学者,所以我不确定我是否在应用程序中做了一些错误的事情,或者我是否需要添加一些完全不同的东西来实现这一点。我已经彻底检查了以前关于堆栈溢出的问题,但找不到任何答案。这是我关于堆栈交换的第一个问题,我们衷心感谢您的反馈。在您的寻呼机适配器类中尝试此操作
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中获取此捆绑包值
@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);
}
在寻呼机适配器类中尝试此操作
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中获取此捆绑包值
@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);
}
你在哪里调用setLightText()函数?你可以使用bundle从pageradapter传递数据。1)你得到一个NullPointerException,因为getItem()总是返回片段的一个新实例。此实例尚未添加到UI,因此未调用onCreateView()。2) 很难访问用于表格布局的片段。编写活动/片段必须实现的某种接口。哪种方式最好取决于您的情况:片段UI必须多久/从哪个源/由哪个事件触发updated@KhizarHayat在PlantStatsActivity类的最后一行。@0X0nosugar我从云(名为PubNub的实时服务)获取数据,我在主(PlantStats)活动中设置了云。这是由树莓皮触发的,每隔几分钟。是否有一个特定的接口,我应该使用这个?我已经看过了,但我不确定这是否是一个理想的方法。可能是这样,但正如我所说,我在Android方面没有什么经验。你在哪里调用setLightText()函数?你可以使用bundle从pageradapter传递数据。1)你得到一个NullPointerException,因为getItem()总是返回片段的一个新实例。此实例尚未添加到UI,因此未调用onCreateView()。2) 很难访问用于表格布局的片段。编写活动/片段必须实现的某种接口。哪种方式最好取决于您的情况:片段UI必须多久/从哪个源/由哪个事件触发updated@KhizarHayat在PlantStatsActivity类的最后一行。@0X0nosugar我从云(名为PubNub的实时服务)获取数据,我在主(PlantStats)活动中设置了云。这是由树莓皮触发的,每隔几分钟。是否有一个特定的接口,我应该使用这个?我已经看过了,但我不确定这是否是一个理想的方法。可能是这样,但正如我所说,我在Android方面没有什么经验。当我放置一个测试int,比如123时,它就起作用了。然而,在这个应用程序中,我从云(一个叫做PubNub的实时服务)中获得了一个值,我在plantStatActivity中初始化了这个值。ViewPageAdapter类是否应该处理我在此活动中从PubNub接收的值?我有一种感觉,这会使这两个类紧密结合在一起,并可能在将来引起问题。你认为呢?不要创建不同的pageradaper类,而是将adapter类与activity类合并,这样可以解决你的问题。我确定,当我放置一个测试int(如123)时,这是可行的。然而,在这个应用程序中,我从云(一个叫做PubNub的实时服务)中获得了一个值,我在plantStatActivity中初始化了这个值。ViewPageAdapter类是否应该处理我在此活动中从PubNub接收的值?我有一种感觉,这会使这两个类紧密结合在一起,并可能在将来引起问题。你认为呢?不要创建不同的pageradaper类,而是将adapter类与activity类合并,这样可以解决你的问题