Android 当代码在MainActivity中工作,但您希望它在片段中时,将代码放在何处?
我能够编写一个简单的计时器,用一个按钮启动和重置时间。我可以在MainActivity中编写它,但现在我只想在一个特定片段上编写它。我有3个导航片段。家庭、历史和学习 目前,我的计时器显示在每个选项卡上 以下是主要活动的内容Android 当代码在MainActivity中工作,但您希望它在片段中时,将代码放在何处?,android,android-fragments,timer,stopwatch,chronometer,Android,Android Fragments,Timer,Stopwatch,Chronometer,我能够编写一个简单的计时器,用一个按钮启动和重置时间。我可以在MainActivity中编写它,但现在我只想在一个特定片段上编写它。我有3个导航片段。家庭、历史和学习 目前,我的计时器显示在每个选项卡上 以下是主要活动的内容 public class MainActivity extends AppCompatActivity { private Chronometer chronometer; private boolean running; @Override protected void
public class MainActivity extends AppCompatActivity {
private Chronometer chronometer;
private boolean running;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
chronometer = findViewById(R.id.chronometer);
}
public void startChronometer(View v) {
if(!running) {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
running = true;
((TextView)findViewById(R.id.startbutton)).setText("End");
} else {
if(running) {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.stop();
running = false;
((TextView) findViewById(R.id.startbutton)).setText("Start");
}
}
}
}
这是空的片段代码
public class HomeFragment extends Fragment {
Chronometer chronometer;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
HomeViewModel homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
View root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}
公共类HomeFragment扩展了片段{
天文钟;
创建视图时的公共视图(@NonNull LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){
HomeViewModel HomeViewModel=ViewModelProviders.of(this.get)(HomeViewModel.class);
视图根=充气机。充气(R.layout.fragment\u home,container,false);
final TextView TextView=root.findviewbyd(R.id.text\u home);
homeViewModel.getText().observe(getViewLifecycleOwner(),new Observer()){
@凌驾
公共void onChanged(@Nullable String s){
textView.setText;
}
});
返回根;
}
}
感谢您的帮助,感谢您花时间阅读此文章。您可以将代码放入
OnViewCreated
功能中。或者简单地使用名为“root”的视图。为了更好地理解,我将名称改为viewRoot
当然,您需要将布局放置在片段中,而不是活动中
public class HomeFragment extends Fragment {
Chronometer chronometer;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
HomeViewModel homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
View viewRoot = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = viewRoot.findViewById(R.id.text_home);
homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
chronometer = viewRoot.findViewById(R.id.chronometer);
//If you want to start the timer
startChronometer(viewRoot);
return root;
}
}
希望我能帮上忙。一开始效果不错。但现在我的问题是,每次单击我的按钮时,它都会崩溃,原因是java.lang.IllegalStateException:在android的父或父上下文中找不到方法startChronometer(视图):在视图类androidx.appcompat.widget.AppCompatButton上定义的onClick属性,id为“startbutton”,谢谢您的帮助!我要做的就是添加setonclicklistener。帮了大忙
public void startChronometer(View v) {
if(!running) {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
running = true;
((TextView)getView().findViewById(R.id.startbutton)).setText("End");
} else {
if(running) {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.stop();
running = false;
((TextView) getView().findViewById(R.id.startbutton)).setText("Start");
}
}
}
}