Android 获取 Fragment 的实际实例

And*_*uez 2 java android android-fragments

我有一个主要活动,它Navigation Drawer在 a 中加载不同的片段RelativeLayout。主要活动还有一个带有过滤按钮的工具栏。我想对已加载的项目进行排序Fragment,但过滤器按钮位于活动中,因此NullPointerException当我调用时它会抛出我MainScreenFragment main = new MainScreenFragment(). 我想知道是否有任何方法可以获取当前片段的实际实例,而不是创建新实例,以避免 NullPointerException。我正在调用的方法Task(muscle);位于Activity. 希望你能帮忙。

\n\n

PS:我已经检查了这里的所有选项,但没有人解决我的问题

\n\n

MainScreenActivity.java

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

MainFragment.java

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n

Ish*_*nha 5

为了获取当前加载的片段的实例,您可以重写该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)

如果您需要进一步的帮助,请告诉我。