我只是第一次使用片段,我的主要活动中有一个片段内的复选框和一个提交按钮。我想要做的是当我按下提交按钮时我想要一个消息,是否选中了复选框项目?
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Spinner Dspinner;
private Button Subbtn;
ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Subbtn = (Button)findViewById(R.id.button);
adapter = ArrayAdapter.createFromResource(this, R.array.spinner_options, android.R.layout.simple_spinner_item);
spinnerListner();
}
public void spinnerListner(){
Dspinner = (Spinner)findViewById(R.id.spinner);
Dspinner.setAdapter(adapter);
Dspinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (position){
case 0:
getSupportFragmentManager().beginTransaction().replace(R.id.frag, BlankFragment.newInstance()).addToBackStack(null).commit();
break;
case 1:
getSupportFragmentManager().beginTransaction().replace(R.id.frag, BlankFragment2.newInstance()).addToBackStack(null).commit();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
);
}
}
BlankFragment.java
public class BlankFragment extends Fragment {
public BlankFragment(){
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
public static Fragment newInstance() {
BlankFragment fragment = new BlankFragment();
return fragment;
}
}
BlankFragment2.java
public class BlankFragment2 extends Fragment {
public BlankFragment2(){
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank_2, container, false);
}
public static Fragment newInstance() {
BlankFragment2 fragment = new BlankFragment2();
return fragment;
}
}
答案 0 :(得分:2)
您可以使用界面与MainActivity进行通信。
- 创建一个界面并在MainActivity上实现它。
- 将已实现的接口传递给片段并将其存储在片段
中- 然后当您的复选框状态更改时检查存储的接口是否为null,如果不为null,则调用实现的方法 接口,实际上是在MainActivity中实现的。
- 这样您就可以与MainActivity进行通信。在MainActivity中,存储您的复选框状态,并按下按钮执行您想要执行的操作。
醇>
<强>接口强>
public interface OnStateChanged {
public void onChange(int state);
}
在MainActivity上实现它,如
MainActivity implements OnStateChanged {
@Override
public void onChange(int state){
// store your data here
}
为Fragment中的 OnStateChanged 接口和功能创建一个将通过接口的变量
在片段中:
OnStateChanged mListener;
public void setOnStateChangeListener(OnStateChanged listener){
mLinstener = listener;
}
当复选框状态改变时调用接口函数
在片段中:
//...if state change...
if(mListener!= null) {
mListener.onChange(/*your value*/);
}
将MainActivity中实现的接口实例传递给片段
在MainActivity中:
fragment.setOnStateChangeListener(this);
答案 1 :(得分:2)
有几种方法可以实现此功能。最简单的方法是在Activity中定义一个接口,让Fragment实现它。(或者你可以单独定义一个接口,让Activity实现它,它是类似的解决方案)
对于更多解决方案,您可以使用Google&#34;片段和活动互动&#34;。
我只能提供一些零碎的代码,因为我找不到具体的变量名称。 首先,在Activity中定义一个接口,如下所示:
public static class MainActivity extends AppCompatActivity{
...
//Container Activity must implement this interface
public interface CheckBoxStateCallback{
public Boolean getTheState();
}
...
其次,让你的片段实现它:
public class BlankFragment extends Fragment implements CheckBoxStateCallback{
public BlankFragment(){
}
@Override
public Boolean getTheState(){
//return your checkbox state
}
...
最后,您需要在Activity中的Button上添加一个点击监听器:
...
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Boolean b = BlankFragment.newInstance().getTheState();
//then you can make a toast
}
});
...
答案 2 :(得分:0)
在MainActivity中,您将实现我们使用方法CheckboxStatusObserver
定义的接口checkBoxChanged
。
public class MainActivity extends AppCompatActivity implements CheckboxStatusObserver{
// other methods
void checkBoxChanged(boolean checkedStatus){
Toast.makeText(getContext(), "status " + checkedStatus, Toast.LENGTH_LONG).show();
}
public interface CheckboxStatusObserver{
void checkBoxChanged(boolean checkedStatus);
}
}
在Fragment中,我们将获得CheckboxStatusObserver
作为父Activity的引用。然后在膨胀Fragment的内容时,我们可以设置一个监听器来检测复选框的on更改。然后我们会调用observer.checkBoxChanged(checkedStatus);
并将复选框的已检查状态传递给它。
public class BlankFragment extends Fragment {
private CheckboxStatusObserver observer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
observer = (CheckboxStatusObserver) getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_blank, container, false);
// Find the checkbox instace using view.findViewById();
// Setup change listener on checkbox instance and notify the observer
{
observer.checkBoxChanged(checkedStatus);
}
return view;
}
}
每当复选框状态发生变化时,都会调用MainActivity中的方法。
有关详细信息,请参阅以下链接:
https://stackoverflow.com/a/25392549/592025
https://developer.android.com/training/basics/fragments/communicating.html
要允许Fragment与其Activity进行通信,您可以在Fragment类中定义接口并在Activity中实现它。 Fragment在其onAttach()生命周期方法中捕获接口实现,然后可以调用Interface方法以与Activity通信。
答案 3 :(得分:0)
在
MainActivity
中创建一个界面,然后单击下面的监听器
try {
((OnClick) this).onSubmitClicked();
} catch (ClassCastException cce) {
cce.printStackTrace();
}
public interface OnClick {
public void onSubmitClicked();
}
现在在Fragment中实现侦听器,这样您就可以获得
onSubmitClicked
实现的方法,如下所示!
public class BlankFragment extends Fragment implements MainActivity.OnClick{
@Override
public void onSubmitClicked() {
//do something here
}
}
答案 4 :(得分:0)
您可以使用Otto事件总线库或Guava EventBus库来实现此目的。它还可以帮助您使应用程序更加模块化。
让我们使用Otto eventbus库来回答您的问题。 我们有以下方案来涵盖 1.在MainActivity中,您有一个SUBMIT按钮 2.在片段A中,您有一个复选框 3.每当您单击“提交”按钮时,您需要一条带有文本的Toast消息,指出是否选中了复选框。
按照以下步骤获得解决方案。
将gradle添加到您的项目中
compile 'com.squareup:otto:1.3.8'
在项目中创建一个Events类,并创建一个事件,以便在单击SUBMIT按钮时发布。例如,您的Events类将包含以下代码。
public class Events {
public static class SubmitEvent {
public SubmitEvent() {}
}
}
在项目中创建一个GlobalBus类,以便您可以在整个应用程序中访问相同的总线。将下面的代码写入其中。
public class GlobalBus {
private static Bus sBus;
public static Bus getBus(){
if (sBus == null)
sBus = new Bus();
return sBus;
}
}
单击SUBMIT按钮时,使用otto eventbus库发布SubmitEvent事件。
Subbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GlobalBus.getBus().post(new Events.SubmitEvent());
}
});
在片段A中,您编写代码以订阅otto事件总线,如下所示。
GlobalBus.getBus().register(this);
在Fragment A中,然后编写一个订阅方法来订阅事件(即SubmitEvent),这样无论何时从MainActivity发布此事件,您都会收到通知并显示正确的消息(即复选框是否为检查与否)。您可以编写订阅方法,如下所示。
@Subscribe
public void showMessage(Events.SubmitEvent events) {
/// check here whether checkbox is checked or not..
/// Based on that show proper message
}
注意:如果您想了解有关otto事件总线库的更多信息,可以查看https://tutorialwing.com/otto-event-bus-tutorial-example/
答案 5 :(得分:0)
这是另一种方式,与我当天评论可能满足您的需求的方式不同
在主要活动中
switch (position){
case 0:
position=0;
getSupportFragmentManager().beginTransaction().replace(R.id.frag, fragment1).addToBackStack(null).commit();
break;
case 1:
position=1;
getSupportFragmentManager().beginTransaction().replace(R.id.frag, fragment2).addToBackStack(null).commit();
break;
}
}
在spite的OnitemClick中
public class Blank1Fragment extends Fragment {
....
public void function(){
//check which checkbox selected and toast;
}
}
public class Blank2Fragment extends Fragment {
....
public void function(){
//check which checkbox selected and toast;
}
}
每个片段都有
{{1}}