【发布时间】:2018-10-06 22:14:18
【问题描述】:
我使用 FragmentPagerAdapter 创建了应用程序,其中包含 3 个片段内部静态类,比如说 MainActivity。基本上,选项卡式活动的 android studio 模板以这种方式生成代码,例如,在 android 文档中也使用该内部静态类 creating swipe view
但这对性能不利,因为我必须使所有变量和函数变为静态才能使其工作,这也是不正确的做法。
所以我尝试将 Fragment 拆分为自己的类,并从这篇文章 communicate between fragment 它告诉我们如何将变量/动作回调从片段发送到父活动(在我的例子中是 MainActivity)
经过一些研究,从 Activity 向 Fragment 发送数据也可以使用接口来完成。但它变成了两者都在相互实施,我得到了
循环继承错误
互联网上讨论如何将数据从 Activity 传递到 Fragment 的大部分话题都是在创建 Fragment、使用 bundle 等时发生的。
对于向服务器请求数据的动态应用程序,该方法似乎无法使用。
当对服务器的请求完成时(之前已经创建的片段),是否有任何正确的方法如何将数据(在我的情况下是列表对象)从活动传递到片段?谢谢你。
这是我的一些代码
主活动
public class MainActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener {
//On create
ViewPager viewPager = findViewById(R.id.vpPager);
MyPagerAdapter adapterViewPager = new MyPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapterViewPager);
//adapter
public static class MyPagerAdapter extends FragmentPagerAdapter {
private static int NUM_ITEMS = 3;
private String tabTitles[] = new String[]{"Home", "History", "My Account"};
public MyPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
// Returns total number of pages
@Override
public int getCount() {
return NUM_ITEMS;
}
// Returns the fragment to display for that page
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return BlankFragment.newInstance();
case 1:
return FragmentHistory.newInstance();
case 2:
return FragmentAccount.newInstance();
default:
return BlankFragment.newInstance();
}
}
// Returns the page title for the top indicator
@Override
public CharSequence getPageTitle(int position) {
return tabTitles[position];
}
}
@Override
public void onFragmentInteraction() {
getKegiatan();
}
}
空白片段
public class BlankFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
private final Context context = getContext();
private SharedPreferences sharedPreferences;
private int mRole;
private ImageView ivNoData;
private ExpandableListView elvKegiatan;
private ListView lvKegiatan;
private EditText etFrom, etTo;
private String dateFrom, dateTo;
private List<Kegiatan> listKegiatan;
private List<Kegiatan> superKegiatanSaya;
private List<Kegiatan> superKegiatanAnak;
public BlankFragment() {
// Required empty public constructor
}
public static BlankFragment newInstance() { //String param1, String param2
BlankFragment fragment = new BlankFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
sharedPreferences = context.getSharedPreferences(
getResources().getString(R.string.myspkey), Context.MODE_PRIVATE);
mRole = sharedPreferences.getInt(getString(R.string.splogin_role), 0);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_kegiatan, container, false);
FloatingActionButton fabAddKeg = view.findViewById(R.id.fabAddKegiatan);
fabAddKeg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(context, TambahKegiatanActivity.class));
}
});
lvKegiatan = view.findViewById(R.id.listViewKegiatan);
elvKegiatan = view.findViewById(R.id.elvKegiatan);
View buttonSearch = view.findViewById(R.id.buttonSearch);
buttonSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onButtonPressed();
}
});
etFrom = view.findViewById(R.id.editTextFrom);
etTo = view.findViewById(R.id.editTextTo);
populateList();
prepareDate();
LinearLayout llRangeKeg = view.findViewById(R.id.linearLayoutRangeKeg);
switch (mRole){
case UserConst.ROLE_USER:
break;
case UserConst.ROLE_SUPER:
case UserConst.ROLE_CEO:
case UserConst.ROLE_CFO:
llRangeKeg.setVisibility(View.GONE);
break;
case UserConst.ROLE_ADMIN:
case UserConst.ROLE_FINANCE:
llRangeKeg.setVisibility(View.GONE);
fabAddKeg.setVisibility(View.GONE);
break;
}
return view;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed() {
if (mListener != null) {
mListener.onFragmentInteraction();
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction();
}
【问题讨论】:
标签: android android-fragments android-activity android-viewpager fragmentpageradapter