【问题标题】:How to startActivity() in fragment when activating other activity or fragment?激活其他活动或片段时如何在片段中启动Activity()?
【发布时间】: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。
  • 请编辑您的问题以提供更多上下文 - 这里没有足够的信息来调试问题。将完整的堆栈跟踪添加到您的问题中,提供与所述堆栈跟踪对应的代码(此部分是否启动了新活动?),并向我们展示您调用导致此崩溃的代码的位置。

标签: android android-intent


【解决方案1】:

您可以尝试使用requireActivity() 而不是getActivity(),但由于您只需要Context 对象而不一定需要Activity 对象,我建议您将getActivity() 替换为requireContext()。

如果这不起作用,那么您可以尝试遵循以下答案:https://stackoverflow.com/a/30498143

PS:我知道这应该作为评论分享,但我的声誉目前只有 41 岁,我无法发表评论,所以写下这个作为答案。

【讨论】:

  • 感谢您的回答。但它不起作用。即使附加链接的解决方案也不起作用。 onAttach(Activity 活动) 已弃用。
  • 您可以尝试使用onAttach(Context context),因为它不被弃用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多