如何在相同 activity 的片段之间传递值?
how pass value between fragments of same activity?
我是 android 开发的新手 我面临的问题是我无法在相同 activity 的片段之间传递字符串值
现在让我简要解释一下我的要求我有两个片段 fragment b 和 fragment c 。每当用户 select 片段 c 中微调器的值我应该传递给片段 c 中的列表视图到目前为止我已经尝试过是:
这是我的片段新需求片段(片段 c):
package com.example.first.servicefirst;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
public class NewRequirements extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
try {
View view = inflater.inflate(R.layout.fragment_dialog_claim, container,
false);
final Button btnupdate;
btnupdate = (Button) view.findViewById(R.id.update);
final Spinner sbu = (Spinner) view.findViewById(R.id.sbuu);
ArrayAdapter<CharSequence> adaptersbu = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sbu.setAdapter(adaptersbu);
final Spinner bu = (Spinner) view.findViewById(R.id.bu);
adapterbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bu.setAdapter(adapterbu);
final Spinner sbuu = (Spinner) view.findViewById(R.id.sbu);
ArrayAdapter<CharSequence> adaptersbuu = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersbuu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sbuu.setAdapter(adaptersbuu);
final Spinner sc = (Spinner) view.findViewById(R.id.sc);
ArrayAdapter<CharSequence> adaptersc = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sc.setAdapter(adaptersc);
final Spinner ssc = (Spinner) view.findViewById(R.id.ssc);
ArrayAdapter<CharSequence> adapterssc = ArrayAdapter.createFromResource
(getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adapterssc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ssc.setAdapter(adapterssc);
setHasOptionsMenu(true);
final String str = sbu.getSelectedItem().toString();
btnupdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Bundle bundle = new Bundle();
FragmentManager fm=getFragmentManager();
Add add = new Add();
bundle.putString("yes", str);
Log.i("Bundle", bundle.toString());
Log.v("Add", str);
add.setArguments(bundle);
FragmentTransaction ft=fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.content_frame, add,"hi");
ft.addToBackStack(null);
ft.commit();
}catch (Exception e){
throw e;}
}
});
return view;
}catch (Exception e){
throw e;
}
}
}
这是片段添加(片段 B)
package com.example.first.servicefirst;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
public class Add extends Fragment implements View.OnClickListener
{
public static Add()
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_btn_add, container, false);
Spinner ldsource=(Spinner)rootView.findViewById(R.id.lead_source);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox1, R.layout.spinnerlayout);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ldsource.setAdapter(adapter);
// EditText editText=(EditText)rootView.findViewById(R.id.title);
Spinner ldtype=(Spinner)rootView.findViewById(R.id.ldtype);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox2,R.layout.spinnerlayout);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ldtype.setAdapter(adapter1);
Spinner ldstatus=(Spinner)rootView.findViewById(R.id.ldstatus);
TextView txt=(TextView)rootView.findViewById(R.id.spinnerTarget);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox3, R.layout.spinnerlayout);
adapter2.setDropDownViewResource(android.R.layout.simple_selectable_list_item);
ldstatus.setAdapter(adapter2);
// Bundle bundle=getArguments();
// String good=bundle.getString("sbu");
ArrayList<LdNewsItem> listContact = GetlistContact();
final ListView lv = (ListView)rootView.findViewById(R.id.ldrequirements);
lv.setAdapter(new customListAdapterldrequirements(getActivity(), listContact));
// lv.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// return false;
// }
// Setting on Touch Listener for handling the touch inside ScrollView
//});
sbu = getArguments().getString("yes");
return rootView;
}
在以下位置收到空指针异常:sbu = getArguments().getString("yes");真的 Donno 哪里犯了错误 如果有人帮助我会非常有帮助 在此先感谢!
如果你想在Fragment之间传递数据,你可以使用下面的方法。
1.You 可以使用 LocalBroadcastManager 使用这个你可以发送数据到 LBM 并且你可以在监听广播数据的目标片段上实现接收器。
最好的方法是使用 Interface
并在 Activity
中处理所有片段更改逻辑。我已经快速编写了一些代码来向您展示这是如何工作的。我没有包含任何构造函数或 Fragment
实例化和填充代码。您必须在 Activity
中保留对两个 Fragment
的引用,并在其中处理 FragmentTransaction
。
如果您不知道该怎么做,请告诉我,我会尝试将其添加到示例代码中。
MainActivity.java
public class MainActivity extends Activity implements FragmentOneListener {
private FragmentOne fragmentOne;
private FragmentTwo fragmentTwo;
@Override
public void sendDataBack(String data) {
if (fragmentTwo != null) {
fragmentTwo.doSomethingWithData(data);
}
}
}
FragmentOne.java
public class FragmentOne extends Fragment {
private FragmentOneListener fragmentOneListener;
private void sendDataBack(String data) {
if (fragmentOneListener != null) {
fragmentOneListener.sendDataBack(data);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
fragmentOneListener = (FragmentOneListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()+ " must implement FragmentOneListener");
}
}
@Override
public void onDetach() {
super.onDetach();
fragmentOneListener = null;
}
public interface FragmentOneListener {
void sendDataBack(String data);
}
}
FragmentTwo.java
public class FragmentTwo extends Fragment {
public void doSomethingWithData(String data) {
}
}
我是 android 开发的新手 我面临的问题是我无法在相同 activity 的片段之间传递字符串值 现在让我简要解释一下我的要求我有两个片段 fragment b 和 fragment c 。每当用户 select 片段 c 中微调器的值我应该传递给片段 c 中的列表视图到目前为止我已经尝试过是:
这是我的片段新需求片段(片段 c):
package com.example.first.servicefirst;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
public class NewRequirements extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
try {
View view = inflater.inflate(R.layout.fragment_dialog_claim, container,
false);
final Button btnupdate;
btnupdate = (Button) view.findViewById(R.id.update);
final Spinner sbu = (Spinner) view.findViewById(R.id.sbuu);
ArrayAdapter<CharSequence> adaptersbu = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sbu.setAdapter(adaptersbu);
final Spinner bu = (Spinner) view.findViewById(R.id.bu);
adapterbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bu.setAdapter(adapterbu);
final Spinner sbuu = (Spinner) view.findViewById(R.id.sbu);
ArrayAdapter<CharSequence> adaptersbuu = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersbuu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sbuu.setAdapter(adaptersbuu);
final Spinner sc = (Spinner) view.findViewById(R.id.sc);
ArrayAdapter<CharSequence> adaptersc = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adaptersc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sc.setAdapter(adaptersc);
final Spinner ssc = (Spinner) view.findViewById(R.id.ssc);
ArrayAdapter<CharSequence> adapterssc = ArrayAdapter.createFromResource
(getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
adapterssc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ssc.setAdapter(adapterssc);
setHasOptionsMenu(true);
final String str = sbu.getSelectedItem().toString();
btnupdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Bundle bundle = new Bundle();
FragmentManager fm=getFragmentManager();
Add add = new Add();
bundle.putString("yes", str);
Log.i("Bundle", bundle.toString());
Log.v("Add", str);
add.setArguments(bundle);
FragmentTransaction ft=fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.content_frame, add,"hi");
ft.addToBackStack(null);
ft.commit();
}catch (Exception e){
throw e;}
}
});
return view;
}catch (Exception e){
throw e;
}
}
}
这是片段添加(片段 B)
package com.example.first.servicefirst;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
public class Add extends Fragment implements View.OnClickListener
{
public static Add()
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_btn_add, container, false);
Spinner ldsource=(Spinner)rootView.findViewById(R.id.lead_source);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox1, R.layout.spinnerlayout);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ldsource.setAdapter(adapter);
// EditText editText=(EditText)rootView.findViewById(R.id.title);
Spinner ldtype=(Spinner)rootView.findViewById(R.id.ldtype);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox2,R.layout.spinnerlayout);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ldtype.setAdapter(adapter1);
Spinner ldstatus=(Spinner)rootView.findViewById(R.id.ldstatus);
TextView txt=(TextView)rootView.findViewById(R.id.spinnerTarget);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
getActivity().getBaseContext(), R.array.dropbox3, R.layout.spinnerlayout);
adapter2.setDropDownViewResource(android.R.layout.simple_selectable_list_item);
ldstatus.setAdapter(adapter2);
// Bundle bundle=getArguments();
// String good=bundle.getString("sbu");
ArrayList<LdNewsItem> listContact = GetlistContact();
final ListView lv = (ListView)rootView.findViewById(R.id.ldrequirements);
lv.setAdapter(new customListAdapterldrequirements(getActivity(), listContact));
// lv.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// return false;
// }
// Setting on Touch Listener for handling the touch inside ScrollView
//});
sbu = getArguments().getString("yes");
return rootView;
}
在以下位置收到空指针异常:sbu = getArguments().getString("yes");真的 Donno 哪里犯了错误 如果有人帮助我会非常有帮助 在此先感谢!
如果你想在Fragment之间传递数据,你可以使用下面的方法。
1.You 可以使用 LocalBroadcastManager 使用这个你可以发送数据到 LBM 并且你可以在监听广播数据的目标片段上实现接收器。
最好的方法是使用 Interface
并在 Activity
中处理所有片段更改逻辑。我已经快速编写了一些代码来向您展示这是如何工作的。我没有包含任何构造函数或 Fragment
实例化和填充代码。您必须在 Activity
中保留对两个 Fragment
的引用,并在其中处理 FragmentTransaction
。
如果您不知道该怎么做,请告诉我,我会尝试将其添加到示例代码中。
MainActivity.java
public class MainActivity extends Activity implements FragmentOneListener {
private FragmentOne fragmentOne;
private FragmentTwo fragmentTwo;
@Override
public void sendDataBack(String data) {
if (fragmentTwo != null) {
fragmentTwo.doSomethingWithData(data);
}
}
}
FragmentOne.java
public class FragmentOne extends Fragment {
private FragmentOneListener fragmentOneListener;
private void sendDataBack(String data) {
if (fragmentOneListener != null) {
fragmentOneListener.sendDataBack(data);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
fragmentOneListener = (FragmentOneListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()+ " must implement FragmentOneListener");
}
}
@Override
public void onDetach() {
super.onDetach();
fragmentOneListener = null;
}
public interface FragmentOneListener {
void sendDataBack(String data);
}
}
FragmentTwo.java
public class FragmentTwo extends Fragment {
public void doSomethingWithData(String data) {
}
}