2016-12-31 48 views
-2

我想更改我的TextView元素的文本,該元素在相應的QuoteFragment.class文件和相關的layout.xml文件中定義。你可以看到該方法的代碼在我的主要活動:NPE片段文本字段 - 爲什麼?

private void forwardToQuoteFragment(Quote quote){ 
    quoteFragment = QuoteFragment.newInstance(quote); 
    View view = quoteFragment.getView(); 
    TextView tv = (TextView) view.findViewById(R.id.quoteFragmentHeader); 
    tv.setText("Quote (" + quote.getId() + "): " + quote.getQuote()); 
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.container, quoteFragment); 
    ft.commit(); 
} 

我調試告訴我,該視圖變量爲空,所以我得到了一個N​​PE。它會使沒有什麼區別,如果我在QuoteFragment.class創建的視圖屬性,你可以看到如下:

public class QuoteFragment extends android.support.v4.app.Fragment { 
    public static final String QUOTE_FRAGMENT_TAG = "QuoteFragment"; 
    public static final String QUOTE_ID = "quoteId"; 
    private View view; 
    private long quoteId; 

    public QuoteFragment(){ 
     // required 
    } 

    // factory to set arguments 
    public static QuoteFragment newInstance(Quote quote) { 
     QuoteFragment fragment = new QuoteFragment(); 
     Bundle args = new Bundle(); 
     args.putLong(QUOTE_ID, quote.getId()); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onAttach(Context context){ 
     super.onAttach(context); 
     Log.i(QUOTE_FRAGMENT_TAG, "onAttach()"); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     Log.i(QUOTE_FRAGMENT_TAG, "onCreate()"); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     view = inflater.inflate(R.layout.fragment_quote, container, false); 
     return view; 
    } 

    public void setQuoteId(long id){ 
     this.quoteId = id; 
    } 

    public long getQuoteId() { 
     return quoteId; 
    } 

    public View getView(){ 
     return this.view; 
    } 
} 

什麼是解決這一問題的最佳方法是什麼?我忽略了什麼?

回答

5

你不能得到View,因爲View沒有繪製到屏幕上尚未: onCreateView()Fragment內沒有被調用,但是,但是你已經嘗試訪問只將創建TextView當調用onCreateView()

您需要設置OnCreateView()方法中的文本一樣的回覆史蒂夫所以

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.fragment_quote, container, false); 
     TextView tv = (TextView) view.findViewById(R.id.quoteFragmentHeader); 
     tv.setText("Quote (" + quote.getId() + "): " + quote.getQuote()); 
     return view; 
    } 
+0

謝謝 - 我會試試看。 我想如果TextView標記在layout.xml中,它會被創建?! 無論如何,我不知道你的方法是否能解決我的問題,因爲我得到了這些信息,哪些文本應該打印在我的MainActivity中,而不是我的Fragment中。這就是爲什麼我想從我的活動中的Fragment中獲取TextView並調用相應的setter方法的原因。 – Jochen

+1

獲得'Qoute'最簡單的方法是將'Bundle'作爲一個'String',放在'newInstance()'方法中創建:'args.putString(QUOTE_QUOTE,quote.getQoute() );' – Steve2955

+0

或者你可以通過使用[Parcelable](https://developer.android.com/reference/android/os/Parcelable.html)並將整個'Qoute'放入Bundle作爲'Parcelable' – Steve2955