2017-11-08 13 views
0

フラグメント内にあるTextViewを変更したいが、そのフラグメントのクラス内に実装された関数を呼び出すことによってアクティビティ内から変更したい。フラグメントのTextViewのテキストをアクティビティ内から変更しようとするとNullPointerExceptionが発生する

私はクラスTestFragment.javaを持っている:

public class TestFragment extends Fragment { 

    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    private String mParam1; 
    private String mParam2; 

    TextView textView; 
    View view; 

    private OnFragmentInteractionListener mListener; 

    public TestFragment() { 
    } 


    public static TestFragment newInstance(String param1, String param2) { 
     TestFragment fragment = new TestFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 

    } 

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

     view = inflater.inflate(R.layout.fragment_test, container, false); 
     textView = (TextView)view.findViewById(R.id.fragmentText); 
     **changeText("TEXT CHANGED");** 

     return view; 
    } 

    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 


    public void changeText(String text){ 
     textView.setText(text); 
    } 

    public interface OnFragmentInteractionListener 
    { 
     void onFragmentInteraction(Uri uri); 
     void changeText(String text); 
    } 
} 

これは私のフラグメントを持っていレイアウトです:

<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.example.tpfragmentsinlistview.TestFragment"> 

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

</FrameLayout> 

これは、フラグメントのコンテナを持っている活動のレイアウト、次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.tpfragmentsinlistview.Main2Activity"> 

    <LinearLayout 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"></LinearLayout> 
</android.support.constraint.ConstraintLayout> 

これは私のアクティビティのJavaクラスです:

public class Main2Activity extends AppCompatActivity implements TestFragment.OnFragmentInteractionListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     TestFragment testF = new TestFragment(); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 


     if(savedInstanceState == null) 
     {    getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, testF).commit(); 
     } 
     testF.changeText("TEXT CHANGED"); 
    } 

    @Override 
    public void onFragmentInteraction(Uri uri) { 
    } 

    @Override 
    public void changeText(String text) { 
    } 
} 

これは私が得るエラーです。この行に関連しています:testF.changeText( "TEXT CHANGED");

E/AndroidRuntime:致命的な例外:メイン プロセス:com.example.tpfragmentsinlistview、PID:30711 java.lang.RuntimeException:活性ComponentInfo {com.example.tpfragmentsinlistview/com.example.tpfragmentsinlistviewを開始できません.Main2Activity}:java.lang.NullPointerException:ヌルオブジェクトリファレンスで仮想メソッド 'void android.widget.TextView.setText(java.lang.CharSequence)'を呼び出そうとしました android.app.ActivityThread.performLaunchActivity(ActivityThread.java :3319) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) android.app.ActivityThread.access $ 1100(ActivityThread.java:229)android.os.Looper.loop(Looper.java:148)の にある、android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1821)ののは、 android.app.ActivityThread.main(ActivityThread.java:7325) java.lang.reflect.Method.invoke(ネイティブメソッド) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java :1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 原因:java.lang.NullPointerException:仮想メソッド 'void android.widget.TextView.setText(java。 lang.CharSequence) 'nullのオブジェクト参照で com.example.tpfragmentsinlistview.TestFragment.changeText(TestFragmen t.java:112) at com.example.tpfragmentsinlistview.Main2Activity.onCreate(Main2Activity.java:31) (android.app.Activity.performCreate(Activity.java:6904) android.app.Instrumentation.callActivityOnCreate機能textChangedは()が適切に動作したときに、android.app.ActivityThread.performLaunchActivityでInstrumentation.java:1136) (ActivityThread.java:3266は)

私は別の解決策を試してみましたが、この問題は解決されませんでした私は何が間違っていたかわからないので、私はAndroidに精通していないので、活動から呼び出されたときではなく、フラグメントクラスの内側から呼び出されます。あなたのコードでは、それは、この行の後になりますので

+0

あなたは、TextViewを間接参照しようとするFragmentのメソッドを呼び出していますが、Fragmentはまだ読み込まれていません。フラグメントに初期テキストを送るには、フラグメントにある 'newInstance()'メソッドを使用し、初期テキストをパラメータとして送信します。 –

答えて

-1

TextViewには、レイアウトがonCreateViewに膨張された後にのみ存在します:あなたの活動のコードがその前に実行される

view = inflater.inflate(R.layout.fragment_test, container, false); 

、あなたは文字列を渡すことができますあなたがしたいが、TextViewには、どこかをonActivityCreatedのように変更する必要があります場合はうまくフラグメントへの活動から、は、onCreateViewまたはをonViewCreatedのTextViewが使用できるようになりますました。

+0

しかし、私はその後にchangeText関数を呼び出します –

+0

onCreateViewを呼び出すAndroidシステムでは、それ以前にtestF.changeText( "TEXT CHANGED")が実行されます。これを単純なログで確認すると、最初に呼び出されるものが表示されます。 –

関連する問題