Android 当代码在MainActivity中工作,但您希望它在片段中时,将代码放在何处?

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

我能够编写一个简单的计时器,用一个按钮启动和重置时间。我可以在MainActivity中编写它,但现在我只想在一个特定片段上编写它。我有3个导航片段。家庭、历史和学习

目前,我的计时器显示在每个选项卡上

以下是主要活动的内容

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");
            }
        }
    } 
}