2016-07-05 103 views
2

我有一個Navigation Drawer的主要活動,它在RelativeLayout中加載不同的片段。主要活動還有一個帶過濾器按鈕的工具欄。我想對加載的Fragment中的項目進行排序,但篩選器按鈕處於活動狀態,所以當我撥打MainScreenFragment main = new MainScreenFragment()時,它會拋出NullPointerException。我想知道是否有任何方法來獲取當前片段的實際實例,而不是創建新實例,以避免NullPointerException。我打電話的方法是Activity中的Task(muscle);。希望你能幫助。Android獲取片段的實際實例

PS:我已經選中這裏所有的選項,但沒有人解決我的問題

MainScreenActivity.java

public class MainScreenActivity extends AppCompatActivity { 

    private ViewPager view; 
    private SimpleTabAdapter adapter; 
    private Button songs; 
    private String email,name; 
    private int id; 
    private TextView emailView, nameView, Username, title; 
    private ImageButton settings; 
    private MySQLiteHelper database; 
    private DrawerLayout drawerLayout; 
    private ListView drawerList; 
    private ActionBarDrawerToggle drawerToggle; 
    public ImageView Sort; 
    private CharSequence activityTitle; 
    private CharSequence itemTitle; 
    private String[] tagTitles; 
    private Toolbar toolbar; 
    private List<String> spinnerArray = new ArrayList<String>(); 
    private String muscle = "ALL"; 
    public Spinner spinner; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     setContentView(R.layout.activity_main_screen); 

     tagTitles = getResources().getStringArray(R.array.navigation_array); 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawerList = (ListView) findViewById(R.id.left_drawer); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.bringToFront(); 
     Sort = (ImageView) findViewById(R.id.Sort); 

     ArrayList<DrawerItem> items = new ArrayList<DrawerItem>(); 
     items.add(new DrawerItem(tagTitles[0],R.mipmap.home)); 
     items.add(new DrawerItem(tagTitles[1],R.mipmap.acrobatics)); 
     items.add(new DrawerItem(tagTitles[2],R.mipmap.profile)); 

     drawerList.setAdapter(new DrawerListAdapter(this, items)); 
     drawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     // Crear ActionBarDrawerToggle para la apertura y cierre 
//  drawerToggle.setDrawerIndicatorEnabled(false); 
     toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); 
     toolbar.setTitle("Home"); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (drawerLayout.isDrawerOpen(drawerList)){ 
        drawerLayout.closeDrawer(drawerList); 
       } 
       else 
        drawerLayout.openDrawer(drawerList); 
      } 
     }); 

     if (savedInstanceState == null) { 
      selectItem(0); 
     } 

     Sort.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new MaterialDialog.Builder(MainScreenActivity.this) 
         .title(R.string.filtertitle) 
         .items(R.array.filter_items) 
         .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() { 
          @Override 
          public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { 
           if (which != -1){ 

           } 
           return true; 
          } 
         }) 
         .positiveText(R.string.choose) 
         .show(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    /* La escucha del ListView en el Drawer */ 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 
    } 

    private void selectItem(int position) { 
     // Reemplazar el contenido del layout principal por un fragmento 
     Fragment fragment = null; 
     switch (position){ 
      case 0: 
       fragment = new MainFragment(); 
       Sort.setVisibility(View.VISIBLE); 
       toolbar.setTitle("Home"); 
       break; 
      case 1: 
       fragment = new WorkoutsFragment(); 
       Sort.setVisibility(View.GONE); 
       toolbar.setTitle("My Workouts"); 
       break; 
      case 2: 
       fragment = new ProfileFragment(); 
       Sort.setVisibility(View.GONE); 
       toolbar.setTitle("Profile"); 
       break; 
     } 

     // Se actualiza el item seleccionado y el título, después de cerrar el drawer 
     drawerList.setItemChecked(position, true); 
     setTitle(tagTitles[position]); 
     drawerLayout.closeDrawer(drawerList); 
    } 

    /* Método auxiliar para setear el titulo de la action bar */ 
    @Override 
    public void setTitle(CharSequence title) { 
     itemTitle = title; 
//  getSupportActionBar().setTitle(itemTitle); 
    } 
    public void WorkoutActivity(){ 
     Intent intent = new Intent(getApplicationContext(), WorkoutActivity.class); 
     startActivity(intent); 
    } 

    public void toast(String text){ 
     Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onBackPressed(){ 
     finish(); 
    } 
} 

MainFragment.java

public class MainFragment extends Fragment { 

    private String email; 
    private String name; 
    public TwoWayView recyclerView; 
    private Button songs; 
    public static JsonWorkout[] Workouts; 
    private SwipeRefreshLayout swipeContainer; 
    private List<String> spinnerArray = new ArrayList<String>(); 
    private String muscle = "ALL"; 
    public Toolbar myToolbar; 


    private View rootView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_fmain, container, false); 
     return rootView; 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
//  Toolbar myToolbar = (Toolbar) rootView.findViewById(R.id.toolbar); 
//  if (myToolbar != null) 
//   ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar); 
     recyclerView = (TwoWayView) getView().findViewById(R.id.list); 
     Intent intent = this.getActivity().getIntent(); 
     email = intent.getStringExtra("Email"); 
     name = intent.getStringExtra("Name"); 
     if (CheckInternet(getActivity().getApplicationContext())){ 
      Task(muscle); 
     } 
     else{ 
      toast("Please check your internet conection."); 
     } 
//  final Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner); 
// 
//  spinnerArray.add("ALL"); 
//  spinnerArray.add("ABS/CORE"); 
//  spinnerArray.add("UPPER BODY"); 
//  spinnerArray.add("LOWER BODY"); 
// 
//  final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.spinner_item_secondary,spinnerArray); 
// 
//  arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
//  spinner.setAdapter(arrayAdapter); 
// 
//  spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
//   @Override 
//   public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
//    recyclerView.setAdapter(null); 
//    String element = spinner.getItemAtPosition(position).toString(); 
//    muscle = element; 
//    Task(muscle); 
//   } 
// 
//   @Override 
//   public void onNothingSelected(AdapterView<?> parent) { 
// 
//   } 
//  }); 

     swipeContainer = (SwipeRefreshLayout) getView().findViewById(R.id.swipeContainer); 
     // Setup refresh listener which triggers new data loading 
     swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       // Your code to refresh the list here. 
       // Make sure you call swipeContainer.setRefreshing(false) 
       // once the network request has completed successfully. 
       if (CheckInternet(getActivity().getApplicationContext())){ 
        Task(muscle); 
       } 
       else{ 
        toast("Please check your internet conection."); 
        swipeContainer.setRefreshing(false); 
       } 
      } 
     }); 
     // Configure the refreshing colors 
     swipeContainer.setColorSchemeResources(android.R.color.holo_blue_bright, 
       android.R.color.holo_green_light, 
       android.R.color.holo_orange_light, 
       android.R.color.holo_red_light); 


    } 

    public void Task(final String muscle){ 

     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.addInterceptor(new Interceptor() { 
      @Override 
      public okhttp3.Response intercept(Chain chain) throws IOException { 
       Request original = chain.request(); 

       // Customize the request 
       Request request = original.newBuilder() 
         .header("Accept", "application/json") 
         .header("Authorization", "auth-token") 
         .method(original.method(), original.body()) 
         .build(); 

       okhttp3.Response response = chain.proceed(request); 
       Log.v("Response",response.toString()); 
       // Customize or return the response 
       return response; 
      } 
     }); 

     OkHttpClient client = httpClient.build(); 
     Retrofit retrofit = new Retrofit.Builder().baseUrl("http://api.silverbarsapp.com") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 
     SilverbarsService service = retrofit.create(SilverbarsService.class); 
     Call<JsonWorkout[]> call = service.getWorkouts(); 
     call.enqueue(new Callback<JsonWorkout[]>() { 
      @Override 
      public void onResponse(Call<JsonWorkout[]> call, Response<JsonWorkout[]> response) { 
       if (response.isSuccessful()) { 
        Workouts = null; 
//     recyclerView.setAdapter(null); 
        if (Objects.equals(muscle,"ALL")){ 
         Workouts = response.body(); 
        } 
        else{ 
         JsonWorkout[] auxWorkout = response.body(); 
         int x = 0; 
         for (int i = 0; i < auxWorkout.length; i++){ 
          String muscleData = auxWorkout[i].getMain_muscle(); 
          if (Objects.equals(muscle, muscleData)){ 
           Workouts[x] = auxWorkout[i]; 
           x++; 
          } 
         } 
        } 
        recyclerView.setAdapter(new WorkoutAdapter(getActivity())); 
        swipeContainer.setRefreshing(false); 
       } else { 
        int statusCode = response.code(); 
        // handle request errors yourself 
        ResponseBody errorBody = response.errorBody(); 
        Log.v("Error",errorBody.toString()); 

       } 
      } 

      @Override 
      public void onFailure(Call<JsonWorkout[]> call, Throwable t) { 
       Log.v("Exception",t.toString()); 
      } 
     }); 
    } 

} 
+0

您可以通過片段backstack獲取實際的片段實例。你知道如何使用它,或者你想讓我發表一個詳細的答案嗎? –

+0

詳細解答請 –

+0

當然。給我幾分鐘。 –

回答

2

爲了得到當前加載的片段的情況下,你可以由此覆蓋FragmentManager.OnBackStackChangedListener接口:

首先得到FragmentManager的一個實例:

FragmentManager fragmentManager = getSupportFragmentManager(); 

接下來,在你的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; 
    } 

接下來,附加一個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 
      } 
     } 
    } 

做讓我知道如果你需要進一步的幫助。

+0

觸發一個片段的後臺任務,它完美的工作,非常感謝,我只是在片段調用中做了一點改變,我只是在另一個監聽器中調用當前片段 –

+0

很高興我是能夠推動你朝着正確的方向前進。快樂的編碼! :) –

0

不知道如果我瞭解你,但你可以得到你的片段

List<Fragments> fragments = getActivity().getFragmentManager().getFragments(); 
+0

簡單,我想從它的父活動 –