私は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です。
コードに欠けているものは何ですか?
inflate
のonCreateView
メソッドのフラグメントのレイアウトをFragment
にすると、findViewById
でActivity
を使用してその要素に簡単にアクセスできます。
この例では、フラグメントレイアウトは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;
}
}
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;
}
私は遅れていますが、この問題を抱えている他の人にとっては。 onCreateViewメソッドでビューを拡大する必要があります。次にonCreateActivity
メソッドをオーバーライドすると、getView().findViewById
を使用できます。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment, container, false);
}
findViewById
でアクティビティクラスのフラグメントのビューにアクセスすることはできません。代わりにできることは...
アクティビティファイルにFragmentクラスのオブジェクトが必要ですよね?そのフラグメントクラスでEditTextクラスのgetterメソッドを作成し、アクティビティでそのメソッドにアクセスします。
edittextオブジェクトが必要なイベントでFragmentクラスにコールバックを作成します。
1)これを試してください:
Eclipseメニュー->プロジェクト->クリーン...
update
2) 'main'レイアウトのインスタンスが2つ以上ある場合、それらのすべてに 'txtXML' idのビューがあるかどうかを確認します
3)
フラグメントは、アクティビティに配置できるアプリケーションのユーザーインターフェイスまたは動作の一部です。フラグメントとの相互作用はFragmentManagerを介して行われ、Activity.getFragmentManager()およびFragment.getFragmentManager()を介して取得できます。
Fragmentクラスは、さまざまな結果を得るためにさまざまな方法で使用できます。これはコアであり、より大きなアクティビティ内で実行されている特定の操作またはインターフェイスを表します。フラグメントは、それが含まれているアクティビティに密接に結びついており、1つ以外のアクティビティは使用できません。フラグメントは独自のライフサイクルを定義しますが、そのライフサイクルはアクティビティに依存します。アクティビティが停止すると、その内部のフラグメントは開始できません。アクティビティが破棄されると、すべてのフラグメントが破棄されます。
勉強 this 。 FragmentManagerを使用する必要があります。
アクティビティonCreateで使用するときにfindViewByIdを使用する場合、すべてをオーバーライドされたメソッドonActivityCreatedに入れるだけです。