片段中的onCreateView未调用

时间:2019-09-20 08:57:08

标签: android android-fragments

我正在重构Android应用程序以使用片段。我有一个片段,我使用transaction.replace方法将其添加到布局中,但未调用其onCreateView方法。代码如下:

FragmentManager fragmentManager = m_Activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

m_StartNewGameFragment = new StartNewGameToggleButtonsFragment();
fragmentTransaction.replace(R.id.bottom_pane, m_StartNewGameFragment);
fragmentTransaction.commit();

String winnerText = null;
if (isComputerWinner)
    winnerText = m_Activity.getResources().getText(R.string.computer_winner).toString();
else
    winnerText = m_Activity.getResources().getText(R.string.player_winner).toString();

m_StartNewGameFragment.updateStats(computerWins, playerWins, winnerText);

fragment的updateStats方法如下:

public void updateStats(int computer_wins, int player_wins, String winnerText) {
     System.out.println("Update stats " + m_ComputerWins);
     m_ComputerWins.setText(Integer.toString(computer_wins));
     m_PlayerWins.setText(Integer.toString(player_wins));
     m_WinnerTextView.setText(winnerText);
}

当调用updateStats时,m_ComputerWins为null,程序崩溃。 m_ComputerWins在该片段的onCreateView方法中初始化,该方法似乎未被调用。

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

在片段类中获取用于computer_wins,player_wins,winnerText的全局变量,并在updateStats方法中对其进行初始化。 然后在onViewCreated()方法中,设置类似

的值
m_ComputerWins.setText(Integer.toString(computer_wins));
 m_PlayerWins.setText(Integer.toString(player_wins));
  m_WinnerTextView.setText(winnerText);

答案 1 :(得分:0)

您永远不知道片段的创建时间(调用onCreate()),因为片段的生命周期与活动的生命周期不同。在您的代码中,您尝试从活动中更新片段。但是以编写代码的方式,几乎可以保证还没有创建您的片段。

搜索如何将参数传递给片段或更新片段,以找出从活动中更新片段的正确方法。您可以找到几个相关的问题,例如this one

答案 2 :(得分:0)

FragmentTransaction仅在下一个事件循环上运行。如果要立即运行片段事务,请使用ssh-keygen -t rsa

请注意,这在进程终止后实际上将无法正常工作,这就是为什么您应该使用fragmentTransaction.commitNowAllowingStateLoss();方法将初始参数值传递给片段的原因。