2016-12-26 7 views
0

私のプロジェクトでは、MainActivityからフラグメントボタンの可視性を設定したいと考えています。しかし問題は、それがNullPointerException()を与えることです。私もlistBtn & gridBtnをスタティックとして作成しました。私はコードの下に使用:アクティビティは、独自のビュー(:R.layout.activity_main EX)を使用しているため、MainActivity()のフラグメント要素にアクセスする方法は?

FirstFragment fragment = (FirstFragment)getSupportFragmentManager().findFragmentById(R.id. <frameLayout Id>); 

    main_page_fragment.listBtn.setVisibility(View.GONE); 
    main_page_fragment.gridBtn.setVisibility(View.GONE); 

答えて

0

あなたはActivityクラスからあなたのフラグメントビューにアクセスすることはできません。むしろ、同じ仕事をする対応するフラグメントクラスで可視性を設定することができます。それが推奨されていませんが、

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.details, container, false); 
     Button listBtn = (Button)view.findviewById(R.id.listBrn); 
     Button gridBtn = (Button)view.findviewById(R.id.gridBrn); 
     listBtn.setVisibility(View.GONE); 
     gridBtn.setVisibility(View.GONE); 
     return view; 
    } 
-1

、あなたはこれを行うことにより、あなたが望むものを達成することができます

がフラグメントでstaticフィールドとして、あなたの意見を宣言します。フラグメントがonCreateViewonActivityCreatedを通過した後、メインアクティビティ(findViewById()など)からアクセスする静的ビューの値を設定します。その後、メインアクティビティから静的ビューに連絡することができます。 BTWメインアクティビティから静的ビューのメソッドを呼び出すときはいつでも、ヌルであるかどうかを確認します。

+0

、このような答えを投稿しないでください。それは本当に悪いことです。正しい方法でやることを助け、苦しいアプローチへの言及を避けるべきです。 – Beloo

+0

さて、私は仕事を達成するための悪いアプローチを知って学んでいると思っていますが、実際には良いことです。あなたはそれらを使用していない間にそれらについて知ることができます。ご覧のとおり、答えの先頭に「おすすめしない」と明記しています。 –

0

フラグメントonCreateViewコールバックがonCreateアクティビティの後にコールされるので、あなたはそれからアクセスしようとしたと思います。そのビューは、onResumeFragmentsコールバックが呼び出された後にのみアクセス可能になります。その場合、フラグメントでアクションを実行する必要があります。

もう一つのヒントは、あなたがやったかthe worstの意見に静的参照を経由してのようにあなたが強く、直接を断片の見解を呼ぶべきではないということです。内部実装の断片化には、このような依存関係を避けるべきです。その代わりに、setInitialStateのようないくつかのメソッドを作成することをお勧めします(名前はビジネスロジックに依存します)。あなたはそのようMainActivityから動的に断片を追加する場合

//this will be called on fragment #onResume step, so views will be ready here. 
public void setInitialState() { 
    listBtn.setVisibility(View.GONE); 
    gridBtn.setVisibility(View.GONE); 
} 
0

:アクティビティで :フラグメントで

private FirstFragment fragment; 

protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //init fragment here 
} 

@Override 
protected void onResumeFragments() { 
    super.onResumeFragments(); 
    fragment.setInitialState(); 
} 

だから、コードを引き起こす

YourFragment fragment = new YourFragment(); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.fragmentContainer, fragment, YOUR_TAG) 
      .commit(); 

次に、あなたがすることができます次のようにフラグメントのメソッドを定義してください:

public void hideButtons() 
{ 
    yourBtn.setVisibility(View.GONE); 
} 

そして活動からそれを呼び出す:

fragment.hideButtons(); 
関連する問題