1

我想要做的事:參考的EditText在ViewPager創建空指針異常

有3個不同的片段用戶輸入數據,然後在第4段的用戶將審查所有的數據輸入到第一在提交到數據庫之前有3個片段。

我遇到的問題:

每次我試圖設置或從EditText上的獲得方法創建一個NullPointerException

我的問題:

對於我」 m試圖做什麼,從一個片段調用EditText的文本值的正確方法是什麼,並且在頁面更改的任何時候將該文本設置在另一個片段的EditText中?

注:

我已經簡化了代碼下降到僅反映便於複製和便於解剖代碼的每個片段一個EditText上。

代碼:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.widget.EditText; 

public class SwipeEnterResults extends FragmentActivity { 

ResultsPagerAdapter mResultsPagerAdapter; 
ViewPager mViewPager; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.swipe_enter_results); 

    mResultsPagerAdapter = new ResultsPagerAdapter(getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager);  
    mViewPager.setAdapter(mResultsPagerAdapter); 
} 

public void onResume() { 
    super.onResume(); 
    //Declare EditText(s) 

    final EditText txt1= (EditText) mViewPager.findViewById(R.id.txt1); 
    final EditText txt2= (EditText) mViewPager.findViewById(R.id.txt2); 
    final EditText txt3= (EditText) mViewPager.findViewById(R.id.txt3); 

    final EditText rvw1= (EditText) mViewPager.findViewById(R.id.rvw1); 
    final EditText rvw2= (EditText) mViewPager.findViewById(R.id.rvw2); 
    final EditText rvw3= (EditText) mViewPager.findViewById(R.id.rvw3); 


    mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 

      rvw1.setText(txt1.getText().toString()); 
      rvw2.setText(txt2.getText().toString()); 
      rvw3.setText(txt3.getText().toString());     
     } 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { } 
     @Override 
     public void onPageScrollStateChanged(int arg0) { } 
    }); 
} 

public class ResultsPagerAdapter extends FragmentPagerAdapter{ 

    public ResultsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment f = new Fragment(); 

     switch (position) { 
     case 0: 
      f = new Swipe1(); 
      break; 
     case 1: 
      f = new Swipe2(); 
      break; 
     case 2: 
      f = new Swipe3(); 
      break; 
     case 3: 
      f = new SwipeReviewResults(); 
      break; 
     } 

     return f; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
     case 0: 
      return getString(R.string.str1); 
     case 1: 
      return getString(R.string.str2); 
     case 2: 
      return getString(R.string.str3); 
     case 3: 
      return getString(R.string.strReview); 
     default: 
      return "Page " + (position + 1); 
     } 
    } 
} 
} 

回答

0

我最終嘗試了幾件事情。我加了mViewPager.setOffscreenPageLimit(3);,然後把我的代碼放在一個if聲明中,條件爲position == 3,這似乎解決了我所有關於nullpointerexception的問題。感謝大家的幫助!

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.widget.CheckBox; 
import android.widget.EditText; 

public class SwipeEnterResults extends FragmentActivity { 

ResultsPagerAdapter mResultsPagerAdapter; 
ViewPager mViewPager; 

//Declare EditText for reviewing data on Fragment SwipeReviewResults 
EditText txt1; 
EditText rvw1; 
EditText txt2; 
EditText rvw2; 
EditText txt3; 
EditText rvw3; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.swipe_enter_results); 

    //Set up ViewPager and allow app to hold prior pages when off screen 
    mResultsPagerAdapter = new ResultsPagerAdapter(getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager);  
    mViewPager.setAdapter(mResultsPagerAdapter); 
    mViewPager.setOffscreenPageLimit(3); 

    //When SwipeReviewResults is displayed, fill EditText's with data from other fragments 
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 

      if (position == 3) { 
       //set values to EditTexts to pull data from 3 entry fragments and display in SwipeReviewResults 
       EditText txt1 = (EditText) mViewPager.findViewById(R.id.txt1); 
       EditText rvw1 = (EditText) mViewPager.findViewById(R.id.rvw1); 
       EditText txt2 = (EditText) mViewPager.findViewById(R.id.txt2); 
       EditText rvw2 = (EditText) mViewPager.findViewById(R.id.rvw2); 
       EditText txt3 = (EditText) mViewPager.findViewById(R.id.txt3); 
       EditText rvw3 = (EditText) mViewPager.findViewById(R.id.rvw3); 


       //Set EditText's on SwipeReviewResults 
       rvw1.setText(txt1.getText().toString()); 
       rvw2.setText(txt2.getText().toString()); 
       rvw3.setText(txt3.getText().toString()); 

      } 
     } 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { } 
     @Override 
     public void onPageScrollStateChanged(int arg0) { } 
    }); 
} 

public class ResultsPagerAdapter extends FragmentPagerAdapter{ 

    public ResultsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment f; 

     switch (position) { 
     case 0: 
      f = new Swipe1(); 
      break; 
     case 1: 
      f = new Swipe2(); 
      break; 
     case 2: 
      f = new Swipe3(); 
      break; 
     case 3: 
      f = new SwipeReviewResults(); 
      break; 
     default: 
      f = new Fragment(); 
      break; 
     } 

     return f; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
     case 0: 
      return getString(R.string.str1); 
     case 1: 
      return getString(R.string.str2); 
     case 2: 
      return getString(R.string.str3); 
     case 3: 
      return getString(R.string.strReview); 
     default: 
      return "Page " + (position + 1); 
     } 
    } 
} 
} 
0

不要讓EditText決賽。試試下面的代碼取代當前的onResume的:

EditText txt1= (EditText) mViewPager.findViewById(R.id.txt1); 
EditText txt2= (EditText) mViewPager.findViewById(R.id.txt2); 
EditText txt3= (EditText) mViewPager.findViewById(R.id.txt3); 

EditText rvw1= (EditText) mViewPager.findViewById(R.id.rvw1); 
EditText rvw2= (EditText) mViewPager.findViewById(R.id.rvw2); 
EditText rvw3= (EditText) mViewPager.findViewById(R.id.rvw3); 
+0

當我嘗試引用EditText進行更改時,這給了我一個錯誤。 – Jim

0

可能是你ViewPager沒有與IDS R.id.txt1,R.id.rvw1,EditTexts ...

投保你有定義swipe_enter_results.xml文件中的所有EditText。否則,某些對象(也許是全部)將等於null,您將得到一個NullPointerException。

+0

有4個獨立的xml佈局,使用不同的ID。這不是問題。通過我的完整設計,它已經接近60個EditText,並且它們中的每一個都以null結尾。 – Jim

1

幾件事情:

  1. 是否有可能在活動中EditTexts是空的,因爲你想所有的碎片和他們的意見之前引用它們(通過他們的視角ID)已由適配器創建?此外,看起來每調用ResultsPagerAdaptergetItem方法,都會創建一個具有其自己視圖的新片段...因此,當創建新片段視圖時,您的活動可能會引用過時的EditText視圖。

  2. 您的活動不應該關心每個片段中的視圖以及圍繞它們的邏輯。讓每個片段處理對其自己的視圖的引用並管理它們周圍的邏輯會更好。你可以做的是有一箇中央緩存,其中EditTexts值由片段存儲/檢索。例如,在Swipe片段的onPause()方法中,您可以將其EditText值存儲在緩存中,並且onResume()方法的SwipeReviewResults片段可以從緩存中提取所有更新的EditText值。

  3. 在適配器的switch語句,你應該利用default塊返回一個空new Fragment()而不是不必要創建它前期的。

我希望這可以幫助你。

+0

像這樣: '@Override \t \t公共片段的getItem(INT位置){ \t \t \t片f; \t \t \t \t \t \t開關(位置){ \t \t \t情況下0: \t \t \t \t F =新SwipeChemicalsApplied(); \t \t \t \t break; \t \t \t殼體1: \t \t \t \t F =新SwipeRaw(); \t \t \t \t break; \t \t \t殼體2: \t \t \t \t F =新SwipeFinished(); \t \t \t \t break; \t \t \t殼體3: \t \t \t \t F =新SwipeReviewResults(); \t \t \t \t break; \t \t \t默認: \t \t \t \t F =新片段(); \t \t \t \t break; \t \t \t} \t \t \t \t \t \t回報F; \t \t}' – Jim

+0

在加載所有內容之前將片段添加到ViewPager的最佳方式是什麼? 此外,我不熟悉存儲到緩存內存,但這似乎是一個很好的選擇,我目前正在探索。我感謝你的幫助,並會讓你知道我得到了什麼樣的結果。希望它適合我! – Jim

+0

更好的開關語句。要回答你的其他問題,你不需要擔心ViewPager會被添加到其他任何東西之前;除去Activity中對EditTexts的引用,按照原樣添加ViewPager,但允許每個Fragment在'onCreateView'生命週期方法中管理對其EditText的引用。對於緩存,您總是可以使用Application類作爲緩存來存儲全局狀態,但請首先閱讀這個:[link](http://stackoverflow.com/questions/4585627/android-application-class-lifecycle)。請標記我的答案是正確的,如果它幫助了你:)謝謝。 –