【发布时间】:2019-12-22 03:34:10
【问题描述】:
在片段'A'中,当某个条件成立时,应该去'ChatActivity'。
Intent intent = new Intent(getContext(), ChatActivity.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("uid", matchedUid);
startActivity(intent);
问题是当其他fragment或Activity显示在顶部时,条件成立所以startActivity没有被执行..发生错误
'java.lang.String android.content.Context.getPackageName()' on a null object reference
下面是完整的代码
public class MatchFragment extends Fragment implements MatchMVP.View {
private static final String TAG = "MatchFragment";
private MatchPresenter matchPresenter;
private ToggleButton randomMatchBtn;
private ProgressBar progressBar, progressCircle;
private TextView searchingText;
private AdView adView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v;
setupMVP();
if(matchPresenter.checkOnlineStatus(getContext())) {
v = inflater.inflate(R.layout.fragment_match, container, false);
setupView(v);
matchPresenter.isSearching();
initAd(v);
} else {
v = inflater.inflate(R.layout.fragment_offline, container, false);
}
return v;
}
private void setupMVP() {
matchPresenter = new MatchPresenter(this);
}
private void setupView(View v) {
progressBar = v.findViewById(R.id.progressbar);
progressCircle = v.findViewById(R.id.progressbar_circle);
searchingText = v.findViewById(R.id.searching_text);
progressBar.setVisibility(View.INVISIBLE);
progressCircle.setVisibility(View.INVISIBLE);
searchingText.setVisibility(View.INVISIBLE);
randomMatchBtn = v.findViewById(R.id.random_match_btn);
randomMatchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(matchPresenter.checkOnlineStatus(getContext())) {
if(randomMatchBtn.isChecked()) {
matchPresenter.searchRandomUser();
progressBar.setVisibility(View.VISIBLE);
} else {
matchPresenter.stopMatch();
progressBar.setVisibility(View.VISIBLE);
}
} else {
showSnackBar("error");
}
}
});
}
private void initAd(View v) {
MobileAds.initialize(getActivity(), "ca-app-pub-6263138384822549~5566878684");
adView = v.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
}
@Override
public void createChatRoom(String matchedUid) {
Intent intent = new Intent(getContext(), ChatActivity.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("uid", matchedUid);
startActivity(intent);
Vibrator vibrator;
if(getContext() != null) {
vibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(700);
}
}
@Override
public void showSnackBar(String msg) {
Snackbar snackbar = Snackbar.make(getActivity().findViewById(android.R.id.content), msg, 2500);
View snackBarLayout = snackbar.getView();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
// Layout must match parent layout type
lp.setMargins(0, 300, 0, 0);
// Margins relative to the parent view.
snackBarLayout.setLayoutParams(lp);
snackbar.show();
}
@Override
public void randomMatchBtnOff() {
randomMatchBtn.setChecked(false);
}
@Override
public void randomMatchBtnDisable() {
randomMatchBtn.setEnabled(false);
}
@Override
public void randomMatchBtnEnable() {
randomMatchBtn.setEnabled(true);
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void showProgressCircle() {
progressCircle.setVisibility(View.VISIBLE);
searchingText.setVisibility(View.VISIBLE);
}
@Override
public void hideProgressCircle() {
progressCircle.setVisibility(View.INVISIBLE);
searchingText.setVisibility(View.INVISIBLE);
}
@Override
public void goAuthActivity() {
Intent intent = new Intent(getContext(), AuthActivity.class);
intent.putExtra("isSanctioned", true);
startActivity(intent);
assert getActivity() != null;
getActivity().finish();
}
@Override
public void onResume() {
super.onResume();
matchPresenter.checkIsSan();
}
@Override
public void onPause() {
super.onPause();
if(isThreadRunning) {
timeCheckThread.interrupt();
}
}
}
错误原因是“片段未附加到其活动”。是的,我知道。我正在用 firebase 制作一个 randomChatting 应用程序。在这个 MatchFragment 中,我正在搜索其他用户。当其他用户开始搜索并与我匹配时,请转到“ChatActivity”让我知道。
但如果我在其他活动片段中,搜索正在激活,它不能进入 ChatActivity。 '片段未附加到其活动'。
因为我在此 MatchFragment 之外的其他活动中。 MatchFragment 分离到它的 Activity。
即使我正在进行其他活动,如何进入 ChatActivity。
【问题讨论】:
-
分享你使用getPackageName()的代码
-
当“条件”成立时,听起来这段代码甚至没有被执行。听起来你需要找到一个更好的地方来运行这段代码。
-
@YashKrishanVerma 我没有使用 getPackageName()。错误部分是'Intent intent = new Intent(getActivity(), ChatActivity.class);'
-
getActivity()返回 null,这表明在代码运行时Fragment未附加到其Activity。您没有提供足够的信息让我们能够确切地确定原因。请研究如何组合minimal reproducible example。 -
请编辑您的问题以提供更多上下文 - 这里没有足够的信息来调试问题。将完整的堆栈跟踪添加到您的问题中,提供与所述堆栈跟踪对应的代码(此部分是否启动了新活动?),并向我们展示您调用导致此崩溃的代码的位置。