3つのタブを持つアプリケーションを作成しようとしています。各タブは別のデバイスから受信したデータを表しています。このデータは5分ごとに受信されますので、タブのテキストを常に変更する必要があります。しかし、NullPointerExceptionの原因となるため、最新の入力データと一致するようにタブのTextViewを更新するのに問題があります。以下は、ここで問題がある主な活動です:TabLayoutでTextViewを更新するとNullPointerExceptionが発生する
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.
}
フィールドlightText
がヌルであるので、私はNullPointerExceptionが取得するには、(私はこれが今のところ、「ライト」タブ上で動作するように取得しようとしています)。
この私がViewPageAdapterクラスを含むてる活動に
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.
}
}
を更新しようとしているのTextViewだフラグメント:
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への初心者だ、または私はこの作品を作るために全く別の何かを追加する必要がある場合。 Stack Overflowの以前の質問を徹底的に見てきましたが、回答が見つかりませんでした。これはStack Exchangeに関する私の最初の質問であり、いかなるフィードバックも心から感謝しています。
を得るのonCreateあなたLightFragmentクラスに続いて、この
を行い、あなたのページャアダプタクラスでこれを試してみてください? –
バンドルを使用してpageradapterからデータを渡すことができます。 – Nitesh
1)getItem()は常にフラグメントの新しいインスタンスを返すので、NullPointerExceptionが発生します。このインスタンスはUIに追加されていないため、onCreateView()は呼び出されていません。 2)TabLayoutに使用されるフラグメントにアクセスすることは困難です。アクティビティ/フラグメントが実装しなければならない何らかのインタフェースを記述します。どれが最も良いかは、状況に応じて異なります。フラグメントUIを更新する必要があるソース/発生元の頻度/起点 – 0X0nosugar