0

私は、内部に多くのフラグメントを持つアクティビティを持っています。特定のフラグメント上にあるときにメニューを膨張させ、膨張したMenuItemをクリックすると、フラグメント内のConstraint Layoutのレイアウトパラメータを変更するFragmentクラスのメソッドを呼び出す必要があります。問題は、私が変更しようとしている制約レイアウト上にNPEがあることです。setLayoutアクティビティからのフラグメント内レイアウトのレイアウト

これらは私が呼んしようとしているメソッドです:

public void searcherOpen() { 
    searchLayout.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT)); 
    searchText.setFocusable(true); 
} 
public void searcherClose() { 
    searchLayout.setLayoutParams(new ConstraintLayout.LayoutParams(0, 0)); 
    searchText.setFocusable(false); 
} 

これらは、メソッドを呼び出しているMenuItemのとおりです。

getMenuInflater().inflate(R.menu.patient_fragment_menu, menu); 
     final MenuItem search = menu.findItem(R.id.menu_search); 
     final MenuItem close_search = menu.findItem(R.id.menu_search_close); 
     search.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       patientFragment.searcherOpen(); 
       search.setVisible(false); 
       close_search.setVisible(true); 
       return true; 
      } 
     }); 
     close_search.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       patientFragment.searcherClose(); 
       search.setVisible(true); 
       close_search.setVisible(false); 
       return true; 
      } 
     }); 

これは私がアクティビティ内の断片を定義する方法でありますonCreate:

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment"); 

そして、これは誤りです:

06-06 14:52:23.314 3682-3682/com.medishare.zeeromed E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.medishare.zeeromed, PID: 3682 
                    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.medishare.zeeromed.fragments.PatientFragment.searcherOpen()' on a null object reference 
                     at com.medishare.zeeromed.DrawerActivity$3.onMenuItemClick(DrawerActivity.java:255) 
                     at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
                     at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969) 
                     at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:959) 
                     at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:623) 
                     at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:154) 
                     at android.view.View.performClick(View.java:5637) 
                     at android.view.View$PerformClick.run(View.java:22393) 
                     at android.os.Handler.handleCallback(Handler.java:751) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:173) 
                     at android.app.ActivityThread.main(ActivityThread.java:6523) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828) 

答えて

0

まず第一に、そして明らかに、この行のコードでは、任意のフラグメントを発見されていません。

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment"); 
0123あなたは findFragmentByTagとフラグメントを見つけるためにしようとするとフラグメントは、存在すなわち、

if(patientFragment != null) { patientFragment.myMethod(); } 

サードnullでない場合

第二に、あなたは常に確認する必要があり、また、あなたのフラグメントがアクティビティに追加されているかどうかを確認、または必要がありますあなたは最後に

if(patientFragment != null && patientFragment.isAdded()){ patientFragment.myMethod(); } 

NPE

の他のいくつかの種類の を終わるかもしれない、とあなたはあなたのフラグメントを作成する場所を、おそらくあなたは、このエラーを得ている理由はある、またはこのような場合には、どのようにあなたがそれを作成します。私はあなたの中にそれを作成して ActivityFragmentActivityになると仮定しているので、それを作成するには getSupportFragmentManager()を使用する必要があります。言い換えれば、フラグメントを取得するには、@ CODERのように getSupportFragmentManagerと呼ぶべきです:

patientFragment = (PatientFragment)getSupportFragmentManager().findFragmentByTag("patientFragment"); 
if(patientFragment != null && patientFragment.isAdded()){ 
    patientFragment.myMethod(); 
} 
0

あなたがsearcherOpen()を呼び出したいとき、あなたのPatientFragmentのようなルックスを提供スタックトレース上のベースがnullです。 これをまずインスタンス化してから、そのメソッドを呼び出す必要があります。 このコール:

patientFragment = (PatientFragment)getFragmentManager().findFragmentByTag("patientFragment"); 

が間違っている、あなたはそれがnewInstance()コールをthrought作成し、FragmentManagerを使用してアクティビティに追加する必要があり、関連する質問についてはthis arcticleを読ん

0

(getSuportFragmentManagerを試してみてください)の代わりにgetFragmentManagerの()

関連する問題