2016-05-12 13 views
1

上の仮想メソッド 'android.view.View android.view.View.findViewById(int型)' を起動しようと、私はBlankFragmentのjava.lang.NullPointerException:nullのオブジェクト参照

package com.hfad.addingafragmenttoframelayout; 


import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import org.w3c.dom.Text; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class BlankFragment extends Fragment { 


    public BlankFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     Log.d("message","onCreateView() of BlankFragment"); 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_blank, container, false); 
    } 

    public void setText(String textToBeSet){ 
     TextView tv = (TextView)this.getView().findViewById(R.id.fragmentText); 
     tv.setText(textToBeSet); 
    } 

} 

を持っており、それはレイアウトです次のとおりです。ここでは

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.hfad.addingafragmenttoframelayout.BlankFragment"> 

    <!-- TODO: Update blank fragment layout --> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="@string/hello_blank_fragment" 
     android:id="@+id/fragmentText"/> 

</FrameLayout> 

MainActivity

package com.hfad.addingafragmenttoframelayout; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //BlankFragment bf = new BlankFragment(); 
     //getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, bf).commit(); 

     BlankFragment bf = new BlankFragment(); 
     bf.setText("hello world"); 
     getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, bf).commit(); 


    } 




} 

であり、ここでのレイアウトがあります

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.hfad.addingafragmenttoframelayout.MainActivity" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/fragment_container" 
     /> 


</LinearLayout> 

アクティビティのonCreateメソッドでは、レイアウトにフラグメントを追加しています。 setTextメソッドを使用してテキストを変更しようとしない限り、これは正常に動作します。

そして、私はこのエラーを取得する:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                          at com.hfad.addingafragmenttoframelayout.BlankFragment.setText(BlankFragment.java:35) 
                          at com.hfad.addingafragmenttoframelayout.MainActivity.onStart(MainActivity.java:29) 

TextView tv = (TextView)this.getView().findViewById(R.id.fragmentText); 

この行を参照誰かがこの例外を発生させているものを説明することはできますか?

+2

[Nullpointer exception]の可能な複製(http://stackoverflow.com/questions/1277684/nullpointer-exception) –

+1

bf.setText( "hello world")を使用してください。 getSupportFragmentManager()。beginTransaction()。add(R.id.fragment_container、bf).commit(); – xAqweRx

答えて

0
TextView tv = (TextView)this.getView().findViewById(R.id.fragmentText); 

onCreateView();で行います。ここで

1

FragmentManagerFragmentを追加する前に、断片のsetTextメソッドを呼び出すbecuase、問題の原因

bf.setText("hello world"); 

ライン。

コールsetText方法bfフラグメントを追加した後:

getSupportFragmentManager().beginTransaction(). 
    add(R.id.fragment_container, bf).commit(); 
    bf.setText("hello world"); // call here 
+0

これは何の違いもありませんでした。同じエラーが発生しています。 – user4913383

8

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 

    View RootView = inflater.inflate(R.layout.fragment_blank, container, false); 

    TextView tv = (TextView)RootView.findViewById(R.id.fragmentText); 
    tv.setText("HI"); 

    return RootView; 
} 
+0

私はあなたの意見を聞いていますが、実際には 'BlankFragment's'オブジェクトを作成しているので、' onCreateView'は呼び出されません。オブジェクトのインスタンス化中にFragmentのライフサイクルメソッドを呼び出す方法はありますか? – user4913383

0

あなたは、TEMを使用することができます

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    Log.d("message","onCreateView() of BlankFragment"); 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_blank, container, false); 
} 

public void setText(String textToBeSet){ 
    TextView tv = (TextView)this.getView().findViewById(R.id.fragmentText); 
    tv.setText(textToBeSet); 
} 

をしないでくださいViewがまだ作成されていない間にStringを保持することができる。

private TextView tv; 
private String holder = ""; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.fragment_blank, container,false); 

    tv = (TextView)v.findViewById(R.id.fragmentText); 
    return v; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    tv.setText(holder); 
} 

public void setText(String textToBeSet){ 
    if(tv != null){ 
     tv.setText(textToBeSet); 
    }else{ 
     holder = textToBeSet; 
    } 
} 
0

私の仮定は、あなたには、いくつかの初期のテキストだけでなく、テキストがMainActivityから後で設定することができるようにあなたのBlankFragmentをインスタンス化したいということです。その場合

私が最初にそうように、最初のテキストを受け入れるようにフラグメントを変更します:nullはその

public class MainActivity extends AppCompatActivity { 
    private BlankFragment mBlankFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState == null) { 
      final Fragment bf = BlankFragment.newInstance("hello world"); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .add(R.id.fragment_container, bf, BlankFragment.class.getName()) 
        .commit(); 
     } 

     mBlankFragment = (BlankFragment) getSupportFragmentManager() 
       .findFragmentByTag(BlankFragment.class.getName()); 
    } 

    private void someTimeLaterWhenWantingToSetNewTextToFragmentFromActivity(CharSequence newText) { 
     if (mBlankFragment != null) { 
      mBlankFragment.setText(newText); 
     } 
    } 
} 

注:

public class BlankFragment extends Fragment { 
    private static final String ARG_INITIAL_TEXT = "arg_initial_text"; 

    public static BlankFragment newInstance(CharSequence initialText) { 
     final BlankFragment fragment = new BlankFragment(); 
     final Bundle args = new Bundle(); 
     args.putCharSequence(ARG_INITIAL_TEXT, initialText); 

     fragment.setArguments(args); 
     return fragment; 
    } 

    public BlankFragment() { 
     // Required empty public constructor 
    } 

    private CharSequence mInitialText; 
    private TextView mText; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mInitialText = getArguments().getCharSequence(ARG_INITIAL_TEXT); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     Log.d("message", "onCreateView() of BlankFragment"); 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_blank, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mText = view.findViewById(R.id.fragmentText); 

     mText.setText(mInitialText); 
    } 

    public void setText(CharSequence textToBeSet) { 
     mText.setText(textToBeSet); 
    } 
} 

アクティビティコードは、次のようになります。 -checkのsavedInstanceStateは、設定の変更などのためにActivity-recreationをガードすることです。

0

問題はFragmentTransactionあるが、それでもまだ断片を取得することはできません

その後
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.add(R.id.fragment_container, BlankFragment.newInstance); 
ft.disallowBackStack(); 
ft.commitNowAllowingStateLoss(); 

デフォルトでは非同期である、あなたはこのarticleは私を助けた

BlankFragment bf = (BlankFragment) getSupportFragmentManager().getFragmentById(R.id.fragment_container); 
bf.setText("hello world"); 

FragmentTransactionからそれを取得する必要がありますこの問題をよりよく理解する

関連する問題