2016-02-14 58 views
0

我想添加一個片段,然後在上述片段中查找一個視圖,並向其中添加一個視圖。不過,我不斷收到此聲明的NullPointerException如何在片段中查找視圖?

FrameLayout container2 = (FrameLayout) fragment.getActivity().findViewById(R.id.content_frame); 

這是我的代碼。有人能告訴我如何解決這個問題嗎?謝謝

FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment fragment = new FragmentNavigationDrawer(); 
    ViewGroup decor = (ViewGroup) getActivity().getWindow().getDecorView(); 
    View child = decor.getChildAt(0); 
    decor.removeView(child); 
    fragmentTransaction.add(decor.getId(), fragment); 
    fragmentTransaction.commit(); 
    FrameLayout container2 = (FrameLayout) fragment.getActivity().findViewById(R.id.content_frame); 
    container2.addView(child); 
+0

爲什麼要從Fragment包含的Activity中做Fragment.getActivity? –

+0

這段代碼在哪裏?在活動中還是在片段中? – Elye

+0

使用片段的getView方法並在返回的視圖上調用findViewById。 – marktani

回答

0

請參閱javadoc FragmentTransaction.commit()。它表示它將時間表更改爲片段返回堆棧。它不會立即發生。它看起來像你期待片段及其視圖立即可用。

另外,我真的很困惑,爲什麼你在裝修視圖中進行更改。通常你會在主機活動的佈局中通過id調用一個視圖,並在其中進行更改。

+0

我認爲OP需要使用'FragmentTransaction.replace' –

1

只要使用吸氣劑。設置你的片段的標記,以便以後可以訪問它,然後呼叫getView()您的片段返回其根視圖,或者使用一個getter訪問特定View

public class MainActivity extends AppCompatActivity { 

    //In onCreate 
    if (getFragmentManager().findFragmentByTag(FragmentNavigationDrawer.TAG) == null) { 
     getFragmentManager() 
      .beginTransaction() 
      .add(android.R.id.content, new FragmentNavigationDrawer(), FragmentNavigationDrawer.TAG) 
      .commit(); 
    } 

    //Later, when you want to add said View: 
    FragmentNavigationDrawer frag = 
     (FragmentNavigationDrawer) getFragmentManager().findFragmentByTag(FragmentNavigationDrawer.TAG) 

    //Return the root view: 
    View fragRootView = frag.getView(); 

    //Return a specific view: 
    frag.getUpdatableViewGroup().addView(newViewToAdd): 

} 

爲了您的片段:

public class FragmentNavigationDrawer extends Fragment { 

    public static final String TAG = FragmentNavigationDrawer.class.getSimpleName(); 

    FrameLayout updatableViewGroup; 

    //Can do this inside onCreateView() whilst inflating your Fragment's Views 
    //That's up to you. 
    @Override 
    public void onViewCreated (View view, Bundle savedInstanceState) { 

     updateableViewGroup = view.findViewById(R.id.updateable_view_group); 

    } 

    public FrameLayout getUpdatableViewGroup() { 
     return updateableViewGroup; 
    } 

成爲自覺的ActivityFragment生命週期。但是,並注意不要試圖訪問片段的意見,直到他們完成了膨脹 - 你ActivityonStart()以後應該沒問題。