1

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に関する私の最初の質問であり、いかなるフィードバックも心から感謝しています。

+0

を得るのonCreateあなたLightFragmentクラスに続いて、この

 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); 

を行い、あなたのページャアダプタクラスでこれを試してみてください? –

+0

バンドルを使用してpageradapterからデータを渡すことができます。 – Nitesh

+0

1)getItem()は常にフラグメントの新しいインスタンスを返すので、NullPointerExceptionが発生します。このインスタンスはUIに追加されていないため、onCreateView()は呼び出されていません。 2)TabLayoutに使用されるフラグメントにアクセスすることは困難です。アクティビティ/フラグメントが実装しなければならない何らかのインタフェースを記述します。どれが最も良いかは、状況に応じて異なります。フラグメントUIを更新する必要があるソース/発生元の頻度/起点 – 0X0nosugar

答えて

0

は、このバンドル値あなたはsetLightText()funcitonを呼び出している

@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); 

    } 
+0

これは、123などのテストintを置くと機能します。しかし、このアプリケーションでは、クラウド(PubNubというリアルタイムサービス)から値を取得しています。これをPlantStatsActivityで初期化します。 ViewPageAdapterクラスは、このアクティビティでPubNubから受け取った値の処理などを行うべきですか?私はこれが2つのクラスを強く結びつけ、将来問題を引き起こすかもしれないと感じています。どう思いますか? –

+0

アクティビティクラスを持つ異なるpageradaperクラスのマージアダプタクラスを作成する代わりに、これはあなたの問題を確実に解決します – Nitesh

関連する問題