我在Fragment中访问方法确实遇到了麻烦的问题。
我得到的错误
流程:com.crelix.crelix,PID:18913 java.lang.NullPointerException:尝试在com.crelix.crelix.NavigationActivity的空对象引用上调用虚拟方法'void com.crelix.crelix.ClickerFragment.refreshViews()'。在com.crelix.crelix.NavigationActivity $ 1 $ 1.run(NavigationActivity.java:84)在android.os.Handler.handleCallback(Handler.java:810)处刷新(NavigationActivity.java:530) (Handler.java:99)在android.os.Looper.loop(Looper.java:189)在android.app.ActivityThread.main(ActivityThread.java:5529)在java.lang.reflect.Method.invoke(本机方法),位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:950)处com.android.internal.os.ZygoteInit处的java.lang.reflect.Method.invoke(Method.java:372)处。主要(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访问它,例如:
public void Refresh()
{
ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentById(R.id.ClickerFragment);
ClickerFragment.refreshViews();
}
在这里我添加我的片段
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;
}
仅findFragmentById
当片段在活动中静态嵌入XML中并指定了时,才可以使用android:id
。
在您的情况下,该片段似乎是在运行时在活动中动态添加的。所以,你可以查找该片段由标签通过调用findFragmentByTag
的FragmentManager。在中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();
}
在创建和使用片段上阅读更多内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句