I got really anoying problem with accessing methods in Fragment.
Error that I got
Process: com.crelix.crelix, PID: 18913 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.crelix.crelix.ClickerFragment.refreshViews()' on a null object reference at com.crelix.crelix.NavigationActivity.Refresh(NavigationActivity.java:530) at com.crelix.crelix.NavigationActivity$1$1.run(NavigationActivity.java:84) at android.os.Handler.handleCallback(Handler.java:810) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:189) at android.app.ActivityThread.main(ActivityThread.java:5529) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:950) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
My Fragment Example:
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;
}
}
And I want to access it from MainActivity like:
public void Refresh()
{
ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentById(R.id.ClickerFragment);
ClickerFragment.refreshViews();
}
Here I add my Fragments
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;
}