2016-03-20 9 views
2

私はAndroidフラグメントを実装しています。私は、フレームワークが自動的にフラグメントを破棄して再作成できることを理解しています。フラグメントを再作成すると、引数を持つコンストラクタではなく、デフォルトのコンストラクタが呼び出されます。 static newInstanceメソッドを実装することによって、フラグメントに引数を提供する方法を示す多くの投稿(this questionへの受け入れられた回答など)があります。Fragment.newInstanceメソッドの理解

私が理解していないのは、誰がnewInstanceと呼んでいるかです。私の最初の印象は、このnewInstanceメソッドの任意の引数を定義できるので、明示的な呼び出しをアプリケーションのどこかに追加する必要があり、名前newInstanceは単なる命名規則です。しかし、フレームワークがデフォルトのコンストラクタを呼び出すことによって作成されたフラグメントに加えて、私に混乱を招く2つ目のフラグメントを作成することになります。

上記の仮定は正しくありません。newInstanceメソッドは、実際には何らかの形で、クラスをインスタンス化するためのJavaの組み込みメソッドのオーバーロードですか?その場合、私はどのように任意の引数リストを取るnewinstanceメソッドを定義できないのか分かりません。それとも、Javaで可能なのですか?Javaだけでは分かりません。

+1

はいコードでnewInstance()を呼び出す必要があります。空のコンストラクタは、**再作成**が必要な場合にフレームワークで使用されます。 – Yazan

+1

P.S:断片化をインスタンス化せずに使用した場合はありますか?つまり、 '... = new ...'を使わずに? – Yazan

+0

実際、はい - それは新しいものを使用しないです。アクティビティのレイアウトのXMLでは、私は要素を持っています。私が知る限りでは、その部分がどのようにインスタンス化されるかです。私はどこにでも明示的な電話を持っていません。とにかく、その仕組みがわからない。 – Dabbler

答えて

3

好きなように機能の名前を付けることができます:getInstancenewFragment。それは重要ではありません、それはヘルパーメソッドだけです。重要なのは、すべての議論をfragment.setArguments(args)とすることです。 Androidシステムはこれらの引数を覚えて、フラグメントが再作成されるときにそれらの引数を使用します。

public static MyFragment newInstance(int arg) { 

    Bundle args = new Bundle(); 
    args.putInt("ARG", arg); 

    MyFragment fragment = new MyFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 
+0

"Androidシステムはこれらの引数を記憶し、フラグメントが再作成されるときにそれらを使用します。たぶん、これは私が紛失している情報です。最初にnewInstanceでフラグメントを作成します。その後、Androidがフラグメントを再作成すると、まずデフォルトのコンストラクタが呼び出され、格納された引数でsetArgumentsが呼び出されます。 – Dabbler

+0

上記のように、アクティビティのレイアウトのXMLでは、私は要素を持っています。私が知る限りでは、その部分がどのようにインスタンス化されるかです。だから、どうしたの?たぶん、私は最初の場所で正しく活動を作成していないでしょう。 – Dabbler

+1

最初の質問:はい。フラグメントのチェックsetArguments javadoc: "ここで指定された引数は、フラグメントの破棄と作成の間に保持されます" xmlフラグメントの作成チェックについて:http://stackoverflow.com/questions/13034746/if-i-declare-a-fragment-in-コードを使って(そしてnewInstance()を呼び出す)、そしてXMLタグを使って、フラグメントを作成する方法が2つあります。 XMLタグフラグメントは、デフォルトコンストラクタを使用してシステムによって自動的に作成されます。この場合、パラメータを別々に渡す必要があります。この場合、newInstanceメソッドは呼び出されません。 –

1

newInstanceあなたは「あなたはドンFragment

に引数を渡すために、ヘルパー関数を定義するためFragmentは、このように他のConstructor beside the default Constructor

を持つべきではないという事実をAndroidのデザインパターンでありますそれを使用する必要がありますが、2つともActivitiesがあるとしましょうFragmentA

ヘルパーfunctioを使用しない場合∎フラグメントをインスタンス化するコードを複製する必要があります。

私は理解していないことは通常あなたがFragments ... ActivityAdapterなどを作成した場所からinstantiateメソッドを使用しますのnewInstance

を呼び出す誰です。

SectionPagerAdapter例:

@Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class below). 
     return PlaceholderFragment.newInstance(position + 1); 
    } 

PlaceholderFragment.newInstance(int position)が、その場合には

public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

で、私は、任意の引数リストを取るのnewInstanceメソッドを定義することができますどのように表示されません。

あなたは、任意の引数リストを渡すことができますが、あなたが値を知っておく必要がありTypeBundleので、Xは、静的な工法として使用されているパラメータ

0

Fragment.newInstance(args1,args2...)のタイプであるだけputX()メソッドを持っています。 静的構築メソッドの利点は言うまでもなくです。しかし、これを行うことで、引数を保存するのに役立ちます。onCreate()誤ってアプリケーションが起動し、アンドロイドが引数なしでコンストラクタでフラグメントを復元するのに役立ちます。

public static StudyFragment newInstance(ArrayList<DailyWordBean.DataBean> list) { 
    Bundle args = new Bundle(); 
    args.putSerializable("data", list); 
    StudyFragment fragment = new StudyFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     list = (ArrayList<DailyWordBean.DataBean>) getArguments().getSerializable("data"); 
     Log.e("study", list.size() + list.get(0).getWordContent()); 
    } 
} 

Parcelableの代わりSerializableを使用することを忘れないでください。

関連する問題