フラグメント内にある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に精通していないので、活動から呼び出されたときではなく、フラグメントクラスの内側から呼び出されます。あなたのコードでは、それは、この行の後になりますので
あなたは、TextViewを間接参照しようとするFragmentのメソッドを呼び出していますが、Fragmentはまだ読み込まれていません。フラグメントに初期テキストを送るには、フラグメントにある 'newInstance()'メソッドを使用し、初期テキストをパラメータとして送信します。 –