2012-05-06 35 views
19

私はAndroidを初めて開発しており、もちろんFragmentsで新しくなっています。フラグメントを使用しているときにfindViewByIdがNULLを返します

メインアクティビティで私のフラグメントのコントロールにアクセスしたいが、 'findViewById'はnullを返す。フラグメントなしで コードが正常に動作します。

フラグメント:MainActivityの

<?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> 

のonCreate:txtXMLがnullの場合、この時点で

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

     this.initialisePaging(); 

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

は、ここに私のコードの一部です。

私のコードには何が欠けていますか?何をすべきですか?

+0

initializePaging()メソッドを投稿してください。 – blacharnia

+0

'this.initialisePaging();で重要なことは、viewPager – mammadalius

答えて

14

あなたは、あなたはそれがあなたのActivityfindViewByIdを持つ要素だ単にアクセスすることができますFragmentonCreateView方法にフラグメントのレイアウトをinflate必要があります。

この例では、私のフラグメントレイアウトは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; 
     } 
    } 
+1

いただきましたいくつかのコードそれを与えることができます...複雑ではありませんか? – vasanth

+0

また、あなたは、AndroidのサポートV4を使用している場合は 'null'なのでを避けるために、' FragmentActivity'と 'getSupportFragmentManager'を使用していることを確認してください。新しいバージョンのAndroid APIのみをビルドする場合は、通常の 'Activity'メソッドと' getSupportFragmentManager'メソッドを使用します。これらの2つの実装方法を組み合わせないでください。 –

2

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

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

更新

2)あなたが 'メイン' レイアウトの2つの以上のインスタンスを持っている場合は、それらのすべてがAフラグメントは、アプリケーションのユーザーの作品ではある

「txtXML」ID

3)との見解を持っているかどうかを確認アクティビティに配置することができます。フラグメントとの相互作用は、FragmentManagerを通じて実行されます.FragmentManagerは、Activity.getFragmentManager()およびFragment.getFragmentManager()を介して取得できます。

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

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

+0

+1にフラグメントを追加するだけです。この問題は解決できません。 – mammadalius

+0

まだ問題はありますか? – breceivemail

+0

「メイン」レイアウトのインスタンスは1つだけですか? – breceivemail

3

あなたが

あなたは正しい、あなたの活動のファイルに断片クラスのオブジェクトを持っている必要があります...あなたは何ができるかを代わりにfindViewByIdで活動クラスのフラグメントのビューにアクセスすることはできませんか?そのフラグメントクラスのEditTextクラスのgetterメソッドを作成し、そのメソッドにアクセスします。

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

+0

私はパフォーマンスにそれの複雑さともブーストを減らすために私の解決策のためのフラグメントを選択するが、それはより複雑になっているように見えます。 – mammadalius

+0

それは強力ですし、あなたに多くの柔軟性 –

4

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

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

あなたは正しいです。私の問題は以前に解決されています。他の人が使用できるように膨らませるためのスニペットを表示してください。 – mammadalius

+0

'@Override パブリックビューonCreateView(LayoutInflater用インフレータ、のViewGroup容器、バンドルsavedInstanceState){ 戻りinflater.inflate(R.layout.fragment、容器、偽)。 } ' – gdi

+0

親愛なる@Futanあなたのコメントを別の回答として書いてください。明確な説明が他の人に役立つようにしてください。もちろん、それを受け入れられた回答として選択することもできます。 – mammadalius

17

あなたが活動のonCreateで使うようfindViewByIdを使用したい場合は、単にonActivityCreatedオーバーライドメソッド内のすべてを置くことができ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; 
} 
+0

これはこれまでに解決されています。私が探していたのは、MainActivityのtxtXMLであり、フラグメント自体ではありませんでした。 – mammadalius

0

上の断片に、このようにしてください。

+0

メソッドonActivityCreatedで同じnullを返します。 – hopeTo

+0

コードを表示してください。 – Moesio

関連する問題