我正在重构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方法中初始化,该方法似乎未被调用。
任何人都可以帮忙吗?
答案 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();
方法将初始参数值传递给片段的原因。