2016-06-17 8 views
0

ここでは何が欠けているのか分かりませんが、フラグメントを作成してFragmentManagerを使用して追加します。その後、レイアウトに提供された情報(Toolオブジェクト)をロードするはずのフラグメントからメソッドを実行します。 InfoActivity.javaでフラグメントの実行前にonCreateViewが呼び出されていない

:ビューが作成される前に何とか方法が実行されているため

public class InfoActivity extends AppCompatActivity{ 

... 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mCatIndex = getIntent().getExtras().getInt("catIndex", 0); 
    mToolIndex = getIntent().getExtras().getInt("toolIndex", 0); 

    // If we are in two-pane layout mode, this activity is no longer necessary 
    if (getResources().getBoolean(R.bool.has_two_panes)) { 
     finish(); 
     return; 
    } 

    // Place an InfoFragment as our content pane 
    InfoFragment f = new InfoFragment(); 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, f).commit(); 

    // Display the correct tool info on the fragment 
    Tool tool = ToolsSource.getInstance(this).getCategory(mCatIndex).getTool(mToolIndex); 
    f.displayTool(tool); 
} 
} 

しかし、レイアウトオブジェクトが初期化されていません。

+0

なぜあなたはonCreateViewの終わりにdisplayToolを呼び出していけませんか? –

+0

私は、最初のビットが同じクラスからではなく、異なるクラスのInfoActivityからのものであることを明確にすべきです。クラスの宣言を明確にするために編集しました。 – NappyXIII

+0

あなたの 'setContentView'はどこにありますか? –

答えて

1

AndroidのUI関連の大部分は、フラグメントトランザクションを含む非同期です。基本的に、UIの変更は実行ループで定期的に発生します。

オプション1:パブリックセッターメソッドを呼び出すときにデータを格納します。ビューが作成されている場合は、すぐにUIを変更します。それ以外の場合は、onViewCreated()まで待ちます。

private Tool mTool; 

@Override 
public void onViewCreated(View view,Bundle savedInstanceState) { 
    // obtain view references 
    if (mTool != null) { 
     updateDisplay(); 
    } 
} 

public void setTool(Tool tool) { 
    mTool = tool; 
    if (getView() != null) { 
     updateDisplay(); 
    } 
} 

private void updateDisplay() { 
    // change UI here 
} 

オプション2:あなたのフラグメントへの引数としてツールを渡します。これにはBundleの中に配置できるようにツールParcelableを作成する必要があります。これが不可能な場合は、ツールの識別子を与え、この識別子に基づいてツールを取得できるようにすることができます(データベース内など)。

これは、通常、次のパターンで行われます(あなたがツールParcelableを作ることができると仮定した場合):

public static InfoFragment newInstance(Tool tool) { 
    InfoFragment fragment = new InfoFragment(); 
    Bundle args = new Bundle(); 
    args.putParcelable("arg_tool", tool); 
    fragment.setArguments(args); 
    return fragment; 
} 

private Tool mTool; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle args = getArguments(); 
    mTool = args.getParcelable("arg_tool"); 
} 

@Override 
public void onViewCreated(View view,Bundle savedInstanceState) { 
    // obtain view references 
    if (mTool != null) { 
     updateDisplay(); 
    } 
} 

は、その後、あなたの活動にあなたはコンストラクタを呼び出すのではなく、ツールを渡す newInstance()を呼び出します。この2番目のアプローチの利点は、ビューの準備ができたらいつでもデータを持ち、引数 Bundleがシステムによって永続化されるため、(たとえば、デバイスを回転させるなどして)構成の変更を行ったときにデータが失われることはありません。

+0

私はオプション1を使用して問題を解決しました。しかし、目的を理解するために、何かを明確にすることはできますか?私はgetView()行まで何が起こっているのか理解しています。それがfalseを返す場合、どうなりますか?後でifステートメントを再度確認する方法はどのように知っていますか? – NappyXIII

+0

@NappyXIII 'setTool()'は、このフラグメントのビューが作成される前または後に発生します。 'onViewCreated()'はフラグメントのビューが作成された後に呼び出されるライフサイクルメソッドです。 'getView()'はこの同じビューを返すべきです(まだ作成されていない場合はnull)。ツールとビューの両方が必要なので、私は両方のものが存在するのを待っています。ビューが最初に作成された場合は、 'setTool'でUIを変更できます。ビューが2番目に作成された場合は、ライフサイクルコールバックのUIを変更できます。 – Karakuri

0

データを表示するためにフラグメントを要求する代わりに、これを試してください。アクティビティにデータを提供するよう依頼します。混乱している場合は先読みしてください。

フラグメント内にコールバックを定義してください。それをアクティビティに実装します。今すぐフラグメントのonCreateViewの後に表示するインターフェイスメソッドを呼び出します。コールバックにキャストできるフラグメント内にアクティビティー参照があります。

次のドキュメントに従って、フラグメント用のインターフェイスコールバックを作成できます。 https://developer.android.com/training/basics/fragments/communicating.html

+0

これは、これがより優れた設計である可能性があるため、これについてさらに検討します。 – NappyXIII

0

onCreateで、フラグメントトランザクションを実行した後で、onCreateメソッドに電話すると... if(mTool != null)と等しいです...フラグメントを作成した直後にツールを初期化してみてください。活動に

public void initTool(Tool t){ 
    mTool = t; 
} 

InfoFragment f = new InfoFragment(); 
// Display the correct tool info on the fragment 
Tool tool = ToolsSource.getInstance(this).getCategory(mCatIndex).getTool(mToolIndex); 
    f.initTool(tool); 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, f).commit(); 

f.displayTool(tool); 
+0

mToolがnullでない、その部分は正常に動作していました。 OnCreateViewで初期化されていないためnullを返すのはmTitleでした。 – NappyXIII

関連する問題