AndroidでFragmentを使用すると、Fragmentの内部コントロールを取得できず、findViewById()の結果がNullになる - 解決済み
非常にシンプルなプログラムですが、修正に時間がかかり、落ち込みました。 <スパン フォーラムで相談し、やっと答えが見つかりました。
説明
アクティビティです。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 値です。
何が問題なのでしょうか?
===============================================================================================================
<スパン 理由
<スパン 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を直接継承していますが、どうしてもうまくいきません。
<スパン
それが理由とは思えませんね。
関連
-
Android Studio 3.1.2 新規プロジェクトのエラー AAPT2エラー:詳細はログを確認してください(Gradle 3.1.2)
-
Android プロジェクト コンパイル時に com.android.builder.internal.aapt.v2.Aapt2Exception に遭遇しました。AAPT2 エラー: 詳細はログを確認してください。
-
障害発生 [INSTALL_FAILED_OLDER_SDK] 解決方法
-
RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi Androidの開発において、アクティビティを開始できません。
-
android:ems="10 "の意味。
-
指定された子にはすでに親がいます。まず、その子の親に対して removeView() をコールする必要があります。
-
アンドロイドプログレスバー自定义
-
AndroidでデータをExcelファイルに書き出す方法
-
Androidで色を取得するいくつかの方法
-
android start activity report android.content.res.Resources$NotFoundException: 文字列リソースID #0x0
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[100%効果的】AndroidStudioコンソールコンパイル出力中国の乱雑なコードを解決する、プロテストソリューション!
-
アンドロイド アルメアビ アルメアビ-v7a
-
android studio3.2 a pitfall: リソースの処理に失敗しました。詳細は上記の aapt の出力を参照してください。
-
AndroidStudioのコンパイル時のエラーを解決します。構成 ':classpath' のすべてのアーティファクトを解決できませんでした。
-
ERROR: x86 エミュレーションには現在ハードウェアアクセラレーションが必要です。
-
エラーを解決する SSLピアが正しくシャットダウンされない
-
Eclipse &プラグインのよくある使用エラーとコンパイルエラー
-
Android LayoutInflaterの原則の分析は、ビュー(a)のステップの深い理解によってあなたのステップを取る
-
ConstraintLayoutにおけるChainとGuidelineの利用について
-
自作のシンプルなアンドロイド用メモ帳アプリ