1. ホーム
  2. Android

AndroidでFragmentを使用すると、Fragmentの内部コントロールを取得できず、findViewById()の結果がNullになる - 解決済み

2022-02-15 01:47:04

非常にシンプルなプログラムですが、修正に時間がかかり、落ち込みました。 <スパン フォーラムで相談し、やっと答えが見つかりました。

説明

アクティビティです。MainActivity、Fragmentの中にあります。FragmentAの中にTextViewがあります。

問題:FragmentA内のTextViewをどうやっても取得できず、戻り値は常にNullになる

具体的な説明

MainActivityのレイアウト:activity_main.xml

<?xml version="1.0" encoding="utf-8"? >

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:name="com.fragmentexercise.FragmentA"
              android:id="@+id/fragment_a"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
</LinearLayout>

FragmentA のレイアウト:fragment_a.xml

<?xml version="1.0" encoding="utf-8"? >

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:textSize="18sp"
    android:text="initialize text" />





MainActivity.java

public class MainActivity extends Activity {

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

	}





FragmentA.java

public class FragmentA extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_a, container, false);
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
// TextView textView1 = (TextView) getView().findViewById(R.id.textView1);
// textView1.setText("change");
	}





具体的な質問

FragmentA.onActivityCreated()内では
TextView textView1 = (TextView) getView().findViewById(R.id.textView1); は常にNullを取得します。
Fragment.onCreateView()内では

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 第2パラメータ container は、常に null 値です。


MainActivityで、findViewById (R.id.textView1) で、やはりNULL値で。

何が問題なのでしょうか?


===============================================================================================================

<スパン 理由


<スパン Activityはandroid.support.v4.app.FragmentActivityを継承し、Fragmentはandroid.support.v4.appを継承させるだけで、Activityを継承させることができます。

こうすることで、FragmentAのonStartなどのメソッドで、getActivity().findViewById(R.id.textView1)がこのTextViewを取得することができるようになります。
android.app.Fragmentから直接継承すると、うまくいきません。Androidのバグかもしれません。
<スパン 私は実際にdeveloper.android.comにあるトレーニングの例に従ってみました。その例は、android 3.0以前のシステムに対応するように作られており、android.support.v4.app.Fragmentを継承していますが、公式の例も問題なく動きます。

私の携帯電話はAndroid 4.1で、Fragmentをサポートできるので、adnroid.app.Fragmentを直接継承していますが、どうしてもうまくいきません。
<スパン それが理由とは思えませんね。