web-dev-qa-db-ja.com

フラグメントの使用時にfindViewByIdがNULLを返す

私はAndroid開発中、そしてもちろんFragmentsの初心者です。

メインアクティビティでフラグメントのコントロールにアクセスしたいのですが、「findViewById」がnullを返します。フラグメントがなければ、コードは正常に機能します。

コードの一部を次に示します。

フラグメント

<?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="wrap_content"
    Android:orientation="vertical"
    tools:ignore="HardcodedText" >

    <EditText
        Android:id="@+id/txtXML"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:ems="10"
        Android:scrollbars="vertical">
    </EditText>

</LinearLayout>

mainActivityのonCreate:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);

        this.initialisePaging();

        EditText txtXML = (EditText) findViewById(R.id.txtXML);}

この時点で、txtXMLはnullです。

コードに欠けているものは何ですか?

23
mammadalius

inflateonCreateViewメソッドのフラグメントのレイアウトをFragmentにすると、findViewByIdActivityを使用してその要素に簡単にアクセスできます。

この例では、フラグメントレイアウトはLinearLayoutであるため、inflateの結果をLinearLayoutにキャストします。

    public class FrgResults extends Fragment 
    {
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            //some code
            LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false);
            //some code
            return ll;
        }
    }
16
mammadalius

OnCreateViewのフラグメントでこのようにしてみてください

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

    if (container == null) {
        return null;
    }

    LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML);

    return ll;
}
19
Ufuk Doganca

私は遅れていますが、この問題を抱えている他の人にとっては。 onCreateViewメソッドでビューを拡大する必要があります。次にonCreateActivityメソッドをオーバーライドすると、getView().findViewByIdを使用できます。

@Override public View onCreateView(LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) 
{
     return      inflater.inflate(R.layout.fragment, container, false);
}
5
gdi

findViewByIdでアクティビティクラスのフラグメントのビューにアクセスすることはできません。代わりにできることは...

アクティビティファイルにFragmentクラスのオブジェクトが必要ですよね?そのフラグメントクラスでEditTextクラスのgetterメソッドを作成し、アクティビティでそのメソッドにアクセスします。

edittextオブジェクトが必要なイベントでFragmentクラスにコールバックを作成します。

3
Nixit Patel

1)これを試してください:

Eclipseメニュー->プロジェクト->クリーン...

update

2) 'main'レイアウトのインスタンスが2つ以上ある場合、それらのすべてに 'txtXML' idのビューがあるかどうかを確認します

3)

フラグメントは、アクティビティに配置できるアプリケーションのユーザーインターフェイスまたは動作の一部です。フラグメントとの相互作用はFragmentManagerを介して行われ、Activity.getFragmentManager()およびFragment.getFragmentManager()を介して取得できます。

Fragmentクラスは、さまざまな結果を得るためにさまざまな方法で使用できます。これはコアであり、より大きなアクティビティ内で実行されている特定の操作またはインターフェイスを表します。フラグメントは、それが含まれているアクティビティに密接に結びついており、1つ以外のアクティビティは使用できません。フラグメントは独自のライフサイクルを定義しますが、そのライフサイクルはアクティビティに依存します。アクティビティが停止すると、その内部のフラグメントは開始できません。アクティビティが破棄されると、すべてのフラグメントが破棄されます。

勉強 this 。 FragmentManagerを使用する必要があります。

2
Bobs

アクティビティonCreateで使用するときにfindViewByIdを使用する場合、すべてをオーバーライドされたメソッドonActivityCreatedに入れるだけです。

0
Moesio