我对使用片段有点新意,并且在片段中设置TextView的文本时遇到了问题。
现在,我有一个Activity,它有一个共同的六个按钮组,以及两个显示在LinearLayout中的片段。我能够使用按钮成功替换LinearLayout中的片段。但是,我注意到一些与更改这两个片段中的TextView相关的奇怪行为。
我在片段类中有一个名为setTimer()的方法,它尝试更改TextView中的文本。奇怪的是,该方法成功运作。但是,一瞬间,文本将恢复为片段布局.xml文件(空字符串)中包含的TextView中的默认文本。
我尝试在LinearLayout中的片段I replace
之前和之后调用setTimer()方法,结果两种方式都相同。如何在不稍后覆盖它们的情况下更改此TextView的内容?谢谢!
MainActivity.java的onCreate()
方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
FocusFragment initialFragment = new FocusFragment();
initialFragment.setFragmentType( Constants.FRAGMENT_WORK );
initialFragment.setTimer( 25 );
getFragmentManager().beginTransaction()
.add( R.id.linearLayout_fragmentHolder, initialFragment, "fragment_work" )
.commit();
}
}
FocusFragment.java:
public class FocusFragment extends Fragment {
int fragment_type;
static TextView timer;
final String TAG = "FocusFragment";
public FocusFragment() {
}
public void setFragmentType( int fragment_type ) {
this.fragment_type = fragment_type;
}
public int getFragmentType() {
return this.fragment_type;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView;
if ( getFragmentType() == Constants.FRAGMENT_WORK ) {
rootView = inflater.inflate( R.layout.fragment_work, container, false );
} else {
rootView = inflater.inflate( R.layout.fragment_break, container, false );
}
timer = ( TextView ) rootView.findViewById( R.id.textView_timer );
return rootView;
}
public boolean setTimer( int timerValue ) {
if ( timer != null ) {
if ( timerValue < 10 ) {
timer.setText( "0" + timerValue + ":00" );
} else {
timer.setText( timerValue + ":00" );
}
Log.d( TAG, "Timer text set successfully." );
return true;
}
Log.w( TAG, "WARNING: setTimer() couldn't find the timer TextView!" );
return false;
}
}
最后,changeFragment()方法,在按下按钮时调用:
public void changeFragment( String fragmentName, int timerValue ){
FocusFragment fragment = new FocusFragment();
if ( fragmentName == "fragment_work" ) {
fragment.setFragmentType( Constants.FRAGMENT_WORK );
} else {
fragment.setFragmentType( Constants.FRAGMENT_BREAK );
}
fragment.setTimer( timerValue );
getFragmentManager().beginTransaction()
.replace( R.id.linearLayout_fragmentHolder, fragment, fragmentName )
.commit();
}
答案 0 :(得分:1)
问题是在调用OnCreateView()
之后调用片段的setTimer()
方法。
解决此问题的一种简单方法是在创建片段时首先调用fragment.setTimerValue(value)
。
void setTimerValue(int value){
this.timerValue = value;
}
然后在OnCreateView()
方法结束时执行:
OnCreateView(){
...
setTimer(timerValue);
return rootView;
}