And*_*uez 2 java android android-fragments
我有一个主要活动,它Navigation Drawer在 a 中加载不同的片段RelativeLayout。主要活动还有一个带有过滤按钮的工具栏。我想对已加载的项目进行排序Fragment,但过滤器按钮位于活动中,因此NullPointerException当我调用时它会抛出我MainScreenFragment main = new MainScreenFragment(). 我想知道是否有任何方法可以获取当前片段的实际实例,而不是创建新实例,以避免 NullPointerException。我正在调用的方法Task(muscle);位于Activity. 希望你能帮忙。
PS:我已经检查了这里的所有选项,但没有人解决我的问题
\n\nMainScreenActivity.java
\n\npublic class MainScreenActivity extends AppCompatActivity {\n\n private ViewPager view;\n private SimpleTabAdapter adapter;\n private Button songs;\n private String email,name;\n private int id;\n private TextView emailView, nameView, Username, title;\n private ImageButton settings;\n private MySQLiteHelper database;\n private DrawerLayout drawerLayout;\n private ListView drawerList;\n private ActionBarDrawerToggle drawerToggle;\n public ImageView Sort;\n private CharSequence activityTitle;\n private CharSequence itemTitle;\n private String[] tagTitles;\n private Toolbar toolbar;\n private List<String> spinnerArray = new ArrayList<String>();\n private String muscle = "ALL";\n public Spinner spinner;\n\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n FacebookSdk.sdkInitialize(getApplicationContext());\n setContentView(R.layout.activity_main_screen);\n\n tagTitles = getResources().getStringArray(R.array.navigation_array);\n drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);\n drawerList = (ListView) findViewById(R.id.left_drawer);\n toolbar = (Toolbar) findViewById(R.id.toolbar);\n toolbar.bringToFront();\n Sort = (ImageView) findViewById(R.id.Sort);\n\n ArrayList<DrawerItem> items = new ArrayList<DrawerItem>();\n items.add(new DrawerItem(tagTitles[0],R.mipmap.home));\n items.add(new DrawerItem(tagTitles[1],R.mipmap.acrobatics));\n items.add(new DrawerItem(tagTitles[2],R.mipmap.profile));\n\n drawerList.setAdapter(new DrawerListAdapter(this, items));\n drawerList.setOnItemClickListener(new DrawerItemClickListener());\n\n // Crear ActionBarDrawerToggle para la apertura y cierre\n// drawerToggle.setDrawerIndicatorEnabled(false);\n toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);\n toolbar.setTitle("Home");\n toolbar.setNavigationOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View v) {\n if (drawerLayout.isDrawerOpen(drawerList)){\n drawerLayout.closeDrawer(drawerList);\n }\n else\n drawerLayout.openDrawer(drawerList);\n }\n });\n\n if (savedInstanceState == null) {\n selectItem(0);\n }\n\n Sort.setOnClickListener(new View.OnClickListener() {\n @Override\n public void onClick(View v) {\n new MaterialDialog.Builder(MainScreenActivity.this)\n .title(R.string.filtertitle)\n .items(R.array.filter_items)\n .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {\n @Override\n public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {\n if (which != -1){\n\n }\n return true;\n }\n })\n .positiveText(R.string.choose)\n .show();\n }\n });\n }\n\n @Override\n public boolean onCreateOptionsMenu(Menu menu) {\n MenuInflater inflater = getMenuInflater();\n inflater.inflate(R.menu.main, menu);\n return super.onCreateOptionsMenu(menu);\n }\n\n /* La escucha del ListView en el Drawer */\n private class DrawerItemClickListener implements ListView.OnItemClickListener {\n @Override\n public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n selectItem(position);\n }\n }\n\n private void selectItem(int position) {\n // Reemplazar el contenido del layout principal por un fragmento\n Fragment fragment = null;\n switch (position){\n case 0:\n fragment = new MainFragment();\n Sort.setVisibility(View.VISIBLE);\n toolbar.setTitle("Home");\n break;\n case 1:\n fragment = new WorkoutsFragment();\n Sort.setVisibility(View.GONE);\n toolbar.setTitle("My Workouts");\n break;\n case 2:\n fragment = new ProfileFragment();\n Sort.setVisibility(View.GONE);\n toolbar.setTitle("Profile");\n break;\n }\n\n // Se actualiza el item seleccionado y el t\xc3\xadtulo, despu\xc3\xa9s de cerrar el drawer\n drawerList.setItemChecked(position, true);\n setTitle(tagTitles[position]);\n drawerLayout.closeDrawer(drawerList);\n }\n\n /* M\xc3\xa9todo auxiliar para setear el titulo de la action bar */\n @Override\n public void setTitle(CharSequence title) {\n itemTitle = title;\n// getSupportActionBar().setTitle(itemTitle);\n }\n public void WorkoutActivity(){\n Intent intent = new Intent(getApplicationContext(), WorkoutActivity.class);\n startActivity(intent);\n }\n\n public void toast(String text){\n Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show();\n }\n\n @Override\n public void onBackPressed(){\n finish();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\nMainFragment.java
\n\npublic class MainFragment extends Fragment {\n\n private String email;\n private String name;\n public TwoWayView recyclerView;\n private Button songs;\n public static JsonWorkout[] Workouts;\n private SwipeRefreshLayout swipeContainer;\n private List<String> spinnerArray = new ArrayList<String>();\n private String muscle = "ALL";\n public Toolbar myToolbar;\n\n\n private View rootView;\n\n @Override\n public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {\n rootView = inflater.inflate(R.layout.fragment_fmain, container, false);\n return rootView;\n }\n\n @Override\n public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n super.onActivityCreated(savedInstanceState);\n// Toolbar myToolbar = (Toolbar) rootView.findViewById(R.id.toolbar);\n// if (myToolbar != null)\n// ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar);\n recyclerView = (TwoWayView) getView().findViewById(R.id.list);\n Intent intent = this.getActivity().getIntent();\n email = intent.getStringExtra("Email");\n name = intent.getStringExtra("Name");\n if (CheckInternet(getActivity().getApplicationContext())){\n Task(muscle);\n }\n else{\n toast("Please check your internet conection.");\n }\n// final Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner);\n//\n// spinnerArray.add("ALL");\n// spinnerArray.add("ABS/CORE");\n// spinnerArray.add("UPPER BODY");\n// spinnerArray.add("LOWER BODY");\n//\n// final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_item_secondary,spinnerArray);\n//\n// arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n// spinner.setAdapter(arrayAdapter);\n//\n// spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n// @Override\n// public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n// recyclerView.setAdapter(null);\n// String element = spinner.getItemAtPosition(position).toString();\n// muscle = element;\n// Task(muscle);\n// }\n//\n// @Override\n// public void onNothingSelected(AdapterView<?> parent) {\n//\n// }\n// });\n\n swipeContainer = (SwipeRefreshLayout) getView().findViewById(R.id.swipeContainer);\n // Setup refresh listener which triggers new data loading\n swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n @Override\n public void onRefresh() {\n // Your code to refresh the list here.\n // Make sure you call swipeContainer.setRefreshing(false)\n // once the network request has completed successfully.\n if (CheckInternet(getActivity().getApplicationContext())){\n Task(muscle);\n }\n else{\n toast("Please check your internet conection.");\n swipeContainer.setRefreshing(false);\n }\n }\n });\n // Configure the refreshing colors\n swipeContainer.setColorSchemeResources(android.R.color.holo_blue_bright,\n android.R.color.holo_green_light,\n android.R.color.holo_orange_light,\n android.R.color.holo_red_light);\n\n\n }\n\n public void Task(final String muscle){\n\n OkHttpClient.Builder httpClient = new OkHttpClient.Builder();\n httpClient.addInterceptor(new Interceptor() {\n @Override\n public okhttp3.Response intercept(Chain chain) throws IOException {\n Request original = chain.request();\n\n // Customize the request\n Request request = original.newBuilder()\n .header("Accept", "application/json")\n .header("Authorization", "auth-token")\n .method(original.method(), original.body())\n .build();\n\n okhttp3.Response response = chain.proceed(request);\n Log.v("Response",response.toString());\n // Customize or return the response\n return response;\n }\n });\n\n OkHttpClient client = httpClient.build();\n Retrofit retrofit = new Retrofit.Builder().baseUrl("http://api.silverbarsapp.com")\n .addConverterFactory(GsonConverterFactory.create())\n .client(client)\n .build();\n SilverbarsService service = retrofit.create(SilverbarsService.class);\n Call<JsonWorkout[]> call = service.getWorkouts();\n call.enqueue(new Callback<JsonWorkout[]>() {\n @Override\n public void onResponse(Call<JsonWorkout[]> call, Response<JsonWorkout[]> response) {\n if (response.isSuccessful()) {\n Workouts = null;\n// recyclerView.setAdapter(null);\n if (Objects.equals(muscle,"ALL")){\n Workouts = response.body();\n }\n else{\n JsonWorkout[] auxWorkout = response.body();\n int x = 0;\n for (int i = 0; i < auxWorkout.length; i++){\n String muscleData = auxWorkout[i].getMain_muscle();\n if (Objects.equals(muscle, muscleData)){\n Workouts[x] = auxWorkout[i];\n x++;\n }\n }\n }\n recyclerView.setAdapter(new WorkoutAdapter(getActivity()));\n swipeContainer.setRefreshing(false);\n } else {\n int statusCode = response.code();\n // handle request errors yourself\n ResponseBody errorBody = response.errorBody();\n Log.v("Error",errorBody.toString());\n\n }\n }\n\n @Override\n public void onFailure(Call<JsonWorkout[]> call, Throwable t) {\n Log.v("Exception",t.toString());\n }\n });\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n
为了获取当前加载的片段的实例,您可以重写该FragmentManager.OnBackStackChangedListener接口:
首先获取一个实例FragmentManager:
FragmentManager fragmentManager = getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)
接下来,在您的selectItem方法中,按以下方式替换片段,而不是执行fragment = new MainFragment()其他操作(因为我不确定您用来膨胀片段的容器布局的名称,我将其称为fragment_container):
switch (position){
case 0:
fragmentManager
.beginTransaction()
.replace(R.id.fragment_container, new MainFragment(), null)
.addToBackStack(null)
.commit();
Sort.setVisibility(View.VISIBLE);
toolbar.setTitle("Home");
break;
case 1:
fragmentManager
.beginTransaction()
.replace(R.id.fragment_container, new WorkoutsFragment(), null)
.addToBackStack(null)
.commit();
Sort.setVisibility(View.GONE);
toolbar.setTitle("My Workouts");
break;
case 2:
fragmentManager
.beginTransaction()
.replace(R.id.fragment_container, new ProfileFragment(), null)
.addToBackStack(null)
.commit();
Sort.setVisibility(View.GONE);
toolbar.setTitle("Profile");
break;
}
Run Code Online (Sandbox Code Playgroud)
接下来,附上OnBackStackChangedListener这样的内容:
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_container);
if (currentFragment instanceof MainFragment) {
//place your filtering logic here using currentFragment
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要进一步的帮助,请告诉我。
| 归档时间: |
|
| 查看次数: |
7245 次 |
| 最近记录: |