29

私はAndroidの開発、そしてもちろんフラグメントの開発に不慣れです。

メインアクティビティでフラグメントのコントロールにアクセスしたいのですが、「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です。

コードに何が欠けているのですか、それとも何をすべきですか?

4

7 に答える 7

21

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;
}
于 2012-10-24T12:46:07.137 に答える
18

のメソッドでinflateフラグメントのレイアウトを行う必要があります。そうすれば、でその要素に簡単にアクセスできます。onCreateViewFragmentfindViewByIdActivity

この例では、フラグメントレイアウトは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;
        }
    }
于 2012-05-07T07:41:00.603 に答える
6

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

@Override public View onCreateView(LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) 
{
     return      inflater.inflate(R.layout.fragment, container, false);
}
于 2012-06-17T18:10:32.593 に答える
3

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

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

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

于 2012-05-06T11:00:37.867 に答える
2

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

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

アップデート

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

3)

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

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

これを研究してください。FragmentManagerを使用する必要があります。

于 2012-05-06T09:46:30.057 に答える
0

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

于 2013-03-09T18:33:18.713 に答える
0

上記のすべての回答は、「レイアウトを返す」方法を示していますが、返されたレイアウトを参照する方法を正確に示していないため、指定されたソリューションを使用できませんでした。私は問題を解決するために別のアプローチを使用しました。フラグメントを処理するFragmentクラスで、onViewCreated()クラスに移動し、親アクティビティ(私の場合はメインアクティビティ)のコンテキストを保存するコンテキスト変数を作成します。

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Context fragmentContext = (MainActivity) view.getContext();
}

それが完了すると、新しいコンテキストを使用して、onViewCreated()メソッド内からフラグメント上のアイテムにアクセスできます。

EditText editText = context.findViewById(R.id.textXML);
于 2020-08-13T05:54:31.923 に答える