2016-12-01 11 views
0

私はFragmentのメソッドにアクセスするのに本当に面倒な問題がありました。私はAndroid StudioからMainActivityのフラグメントメソッドにアクセス

プロセスだ

エラー:com.crelix.crelix、PID:18913 のjava.lang.NullPointerException:「無効com.crelix.crelix.ClickerFragment.refreshViewsを仮想メソッドを呼び出そうと() 'null nullオブジェクト参照の場合 com.crelix.crelix.NavigationActivity.Refresh(NavigationActivity.java:530) com.crelix.crelix.NavigationActivity $ 1 $ 1.run(NavigationActivity.java:84) android.os。 Handler.handleCallback(Handler.java:810) android.os.Handler.dispatchMessage( java.lang.reflect.Method.invokeでandroid.app.ActivityThread.mainでandroid.os.Looper.loop(Looper.java:189) (ActivityThread.java:5529) (AT Handler.java:99) ネイティブメソッド) (java.lang.reflect.Mava.372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:950) at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:745)

マイ・フラグメント例:

package com.crelix.crelix; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.CardView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import org.w3c.dom.Text; 

public class ClickerFragment extends Fragment { 

     public static ClickerFragment newInstance() { 
      ClickerFragment fragment = new ClickerFragment(); 
     return fragment; 
    } 

    public ClickerFragment() { 
    } 

private TextView MoneyText; 
private TextView MoneyPerTapTView; 
private TextView BoxesText; 
private TextView BoxesPerTapTView; 
private ProgressBar progressBar; 

MainHolder Main = new MainHolder(); 

public void refreshViews(){ 
    MoneyText.setText("Money: " +Main.Money[0]); 
    MoneyPerTapTView.setText("$ " + Main.Money[1] + " per tap"); 
    BoxesText.setText("Boxes: " + Main.Boxes[0] + "/100"); 
    BoxesPerTapTView.setText("Points " + Main.Boxes[1] + " per tap"); 
    progressBar.setProgress(Main.Boxes[0]); 
} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_clicker, container, false); 
     MoneyText = (TextView) rootView.findViewById(R.id.MoneyText); 
     MoneyPerTapTView = (TextView) rootView.findViewById(R.id.MoneyPerTapTView); 
     BoxesText = (TextView) rootView.findViewById(R.id.BoxesText); 
     BoxesPerTapTView = (TextView) rootView.findViewById(R.id.BoxesPerTapTView); 
     progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); 
     return rootView; 
    } 

} 

そして、私は次のようにMainActivityからアクセスしたい:私はあなたの中にこれを行うことができ

ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.frame_container); 
+1

[NullPointerExceptionとは何か、それを修正するにはどうすればよいですか?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

この問題は、フラグメントが表示されているか、要素がまだ作成されていません。さらに明確にするために、フラグメントのライフサイクルを見てください。しかし、その要点は、refreshViewを呼び出そうとしているときにonCreateViewがまだ起動していない可能性が最も高いです。 – aminner

+0

@Manzaが編集されました。 ;) – trakasi

答えて

1

を行います。

あなたのケースでは、フラグメントがアクティビティ内の実行時に動的に追加されたように見えます。したがって、このフラグメントタグで検索すると、FragmentManagerfindFragmentByTagを呼び出すことができます。あなたのonNavigationItemSelectedでは、これに変更する必要があります:

public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    String TAG = ""; 
    Fragment fragment = null; 
    if (id == R.id.nav_clicker) { 
    fragment = new ClickerFragment(); 
    TAG = "CLICKER_TAG"; 
    } else if (id == R.id.nav_upgrades) { 
    fragment = new UpgradeFragment(); 
    TAG = "UPDATE_TAG"; 
    } 
    // You need to add TAG to another fragment. 
    ... 

    getSupportFragmentManager().beginTransaction(). 
       replace(R.id.frame_container, fragment, TAG). 
       commit(); 
    ... 
    return true; 
} 

今、あなたはタグによってフラグメントを検索することができます

ClickerFragment clickerFragment = (ClickerFragment) getSupportFragmentManager() 
                .findFragmentByTag("CLICKER_TAG"); 
// Now you have the fragment 
// But remember to check if the fragment null 
if(clickerFragment != null) { 
    ClickerFragment.refreshViews(); 
} 

Creating and Using Fragmentsで続きを読みます。

0

私のフラグメントを追加ここで

public void Refresh() 
{ 
    ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentById(R.id.ClickerFragment); 
    ClickerFragment.refreshViews(); 
} 

onNavigationItemSelectedすべての場合、Fragments

あなたの Refresh方法で
Fragment fragment = null; 
String tag = null; 
if (id == R.id.nav_clicker) { 
    fragment = new ClickerFragment(); 
    tag = "ClickerFragment"; 
} 
... 
if (fragment != null) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    //Add a tag parameter 
    fragmentManager.beginTransaction() 
     .replace(R.id.frame_container, fragment, tag).commit(); 
} 

断片が、静的アクティビティ内でXMLに埋め込まれ、android:idを与えられた場合にのみ、findFragmentByIdを使用することができ、この

public void Refresh() 
{ 
    ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentByTag("ClickerFragment"); 
    ClickerFragment.refreshViews(); 
} 
+0

ありがとうございますが、まだ同じエラー:/ – trakasi

0

であなたのMainActivityコードを置き換え

public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    Fragment fragment = null; 
    if (id == R.id.nav_clicker) { 
     fragment = new ClickerFragment(); 
    } else if (id == R.id.nav_upgrades) { 
     fragment = new UpgradeFragment(); 
    } else if (id == R.id.nav_warehouse) { 
     fragment = new WarehouseFragment(); 
    } else if (id == R.id.nav_postservice) { 
     fragment = new PostserviceFragment(); 
    } else if (id == R.id.nav_shop) { 
     fragment = new ShopFragment(); 
    } else if (id == R.id.nav_market) { 
     fragment = new MarketFragment(); 
    } else if (id == R.id.nav_workshop) { 
     fragment = new WorkshopFragment(); 
    } else if (id == R.id.nav_garage) { 
     fragment = new GarageFragment(); 
    } else if (id == R.id.nav_museum) { 
     fragment = new MuseumFragment(); 
    } else if (id == R.id.nav_collections) { 
     fragment = new CollectionsFragment(); 
    } 
    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 
    } 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
関連する問題