1

我試圖用3個選項卡創建一個應用程序,每個選項卡都表示從另一個設備接收的數據。我每隔5分鐘左右收到一次這些數據,所以我需要標籤中的文字不斷變化。但是,我無法更新選項卡中的TextView以匹配最新的傳入數據,因爲它會導致NullPointerException。以下是主要活動在位於該問題:在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. 
} 

我得到一個NullPointerException,因爲該領域lightText爲空(我只是試圖讓這個以「光」選項卡上的工作,現在是)。

這對誰的TextView的,我想在活動更新

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,所以我真的不知道,如果我做錯事的應用程序,或者如果我需要添加完全不同的東西,使這項工作。我已經徹底查看了Stack Overflow的前幾個問題,並且找不到任何答案。這是我在Stack Exchange上的第一個問題,任何反饋都是真誠的讚賞。

+0

你在哪裏調用setLightText()功能可按? –

+0

你可以使用bundle從pageradapter傳遞數據.. – Nitesh

+0

1)你得到一個NullPointerException,因爲getItem()總是返回一個新的片段實例。這個實例還沒有被添加到UI,所以onCreateView()沒有被調用。 2)很難訪問用於TabLayout的片段。寫一些活動/片段必須執行的接口。哪種方式最好取決於您的情況:片段UI必須更新哪個源/觸發哪個事件 – 0X0nosugar

回答

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

    } 
+0

這個工程,當我把一個測試int,如123.但是,在應用程序中,我從雲(一個實時服務稱爲PubNub),我在PlantStatsActivity中初始化的價值。 ViewPageAdapter類是否應該像PubNub一樣處理此活動中處理的值?我有一種感覺,這會使兩個班級緊密結合,並可能在未來造成問題。你怎麼看? –

+0

而不是創建不同的pageradaper類合併適配器類與活動類,這將解決您的問題確定 – Nitesh

相關問題