0

Innerhalb meiner MainActivity.java Klasse habe ich ein Startfragment namens MainScreenFragment.java, die wie erwartet funktioniert. Wenn der Benutzer jedoch auf den zweiten Menüpunkt in meinem drawer-layout klickt, ersetze ich ihn durch ein anderes Fragment namens UserBoxGLBFragment.java. Durch Verwenden von Log.d(); Rufen Sie innerhalb der onCreateView und onViewCreated Ich habe veröffentlicht, dass UserBoxGLBFragment Methoden überhaupt nicht aufgerufen werden (was wahrscheinlich ist, warum ich es nicht Inhalt sehe). Kannst du mir helfen herauszufinden, warum das passiert? Hier sind die Klassen:Fragment onCreateView usw. Methoden werden nicht aufgerufen

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

private Toolbar mToolbar; 

// NavMenu member vars 
private DrawerLayout mDrawerLayout; 
private NavigationView navigationView; 
private ActionBarDrawerToggle mToggle; // Button for toggling the side menu 

// Keeps the position of the previously selected menu item(0 : Home) 
int position = 0; 

// Declaring our dialog 
ImportantDialogFragment dialogFragment = new ImportantDialogFragment(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Showing the disclaimer dialog every time the app starts 
    dialogFragment.show(getSupportFragmentManager(),"IMPORTANT_NOTICE"); 

    mDrawerLayout = findViewById(R.id.drawerLayout); 
    navigationView = findViewById(R.id.nav_view); 
    mToggle = new ActionBarDrawerToggle(this,mDrawerLayout,R.string.drawer_open,R.string.drawer_closed); // Instantiating our button 


    mToolbar = findViewById(R.id.navActionBar); 
    setSupportActionBar(mToolbar); // check quick doq 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
    mToolbar.setTitle(""); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    // Sets the default selected menu item, to the Home item 
    navigationView.getMenu().findItem(R.id.nav_home).setChecked(true); 

    // Used to help on check and uncheck menu items when the user clicks on them 
    final List<MenuItem> items = new ArrayList<>(); 
    Menu menu; 
    menu = navigationView.getMenu(); 

    // Fill the list with all the menu items 
    for(int i=0; i<menu.size();i++) { 
     items.add(menu.getItem(i)); 
    } 

    // Toast.makeText(this, "size:" + items.size(), Toast.LENGTH_SHORT).show(); 

    // Set the default starting screen to the mainScreen 
    FragmentManager startingScreenManager = getSupportFragmentManager(); 
    FragmentTransaction startingScreenTransaction = startingScreenManager.beginTransaction(); 

    MainScreenFragment fragment = new MainScreenFragment(); 
    startingScreenTransaction.add(R.id.FrameLayoutContainer, fragment); 
    startingScreenTransaction.commit(); 

    final UserBoxGLBFragment glbFragment = new UserBoxGLBFragment(); 
    // When an item inside the NavView gets clicked, then handle the event... 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 

     // Initializing these vars again for use in this inner class 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     // Replace the main Fragment in this activity based on the menu item selected 
      switch (item.getItemId()) { 
       case R.id.nav_home: 
        MainScreenFragment mainScreenFragment = new MainScreenFragment(); 
        fragmentTransaction.replace(R.id.FrameLayoutContainer,mainScreenFragment); 
        fragmentTransaction.commit(); 
        break; 
       case R.id.nav_UserBoxGLB: 
        //UserBoxGLBFragment glbFragment = new UserBoxGLBFragment(); 
        fragmentTransaction.replace(R.id.FrameLayoutContainer,glbFragment); 
        fragmentTransaction.commit(); 
        break; 
       case R.id.nav_UserBoxJP: 
        break; 
       case R.id.nav_events: 
        Toast.makeText(MainActivity.this, "Events are not available yet! Sorry", Toast.LENGTH_SHORT).show(); 
        break; 
       case R.id.nav_feedback: 
        composeEmail(emails,"Feedback", "[Your message here]"); 
        break; 
       case R.id.nav_contact_us: 
        composeEmail(emails,"Contact Us", "[Your message here]"); 
        break; 
       case R.id.nav_website: 
        // Open the website's URL in a browser window 
        Intent intent = new Intent(); 
        intent.setAction(Intent.ACTION_VIEW); 
        intent.addCategory(Intent.CATEGORY_BROWSABLE); 
        intent.setData(Uri.parse("http://www.google.com")); 
        startActivity(intent); 
        break; 
       case R.id.nav_about: 
        Intent aboutIntent = new Intent(MainActivity.this, AboutPageActivity.class); 
        startActivity(aboutIntent); 
        break; 
       default: 
        return onNavigationItemSelected(item); 
      } 
      items.get(position).setChecked(false); 
      item.setChecked(true); 
      mDrawerLayout.closeDrawers(); 
      return false; 
     } 
    }); 

    mDrawerLayout.addDrawerListener(mToggle); 
    // Set the hamburger icon's color 
    mToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.NavActionBarTextColor)); 
    mToggle.syncState(); 
} 

// When an item from the Action Bar gets tapped, then... 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return mToggle.onOptionsItemSelected(item) || onOptionsItemSelected(item); 
} 

private String[] emails = {"[email protected]"}; 

/** 
* Send an email to the @adress with a @subject 
* @param addresses The email adress(es) to send the email to 
* @param subject The email's subject 
*/ 
public void composeEmail(String[] addresses, String subject, String message) { 
    Intent intent = new Intent(Intent.ACTION_SENDTO); 
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this 
    intent.putExtra(Intent.EXTRA_EMAIL, addresses); 
    intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    intent.putExtra(Intent.EXTRA_TEXT,message); 
    if (intent.resolveActivity(getPackageManager()) != null) { 
     startActivity(intent); 
    } 
} 
} 

MainScreenFragment.java:

public class MainScreenFragment extends Fragment { 

// Main Grid View 
GridView gridView; 

public MainScreenFragment() { 
    // Required empty public constructor 
} 

// Create a Context Menu when an item in the GridView is long-pressed 
@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle("Card Options"); 
    //AdapterView.AdapterContextMenuInfo cmi = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    menu.add(1,v.getId(),0, "Add Card to GLB"); 
    menu.add(2,v.getId(),0,"Add Card to JP"); 
} 

// When an item in the context menu gets selected, call a method 
@Override 
public boolean onContextItemSelected(MenuItem item) { 

    // Get some extra info about the contextMenu 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 

    int position = info.position; // clicked view's position 

    if(item.getTitle().equals("Add Card to GLB")) { 
     addCardMessage(position, "added to GLB"); 
     addSelectedCardToGlobalUserBox(position); 
    } else if (item.getTitle().equals("Add Card to JP")) { 
     addCardMessage(position , "added to JP"); 
    } else 
    { 
     return false; 
    } 
    return false; 
} 

/** 
* Creates a snackbar message, telling the user which card was added to which box 
* @param id The position of the chosen card 
* @param text Defines into which User Box the card was added 
*/ 
private void addCardMessage(int id, String text) { 
     final Snackbar snackbar = Snackbar.make(gridView, id + " " + text ,Snackbar.LENGTH_LONG); 

     snackbar.setAction("Dismiss", new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      snackbar.dismiss(); 
     } 
    }); 
    snackbar.setActionTextColor(Color.MAGENTA); 
    snackbar.show(); 
} 


UserBoxGLBFragment fragment = new UserBoxGLBFragment(); 
private void addSelectedCardToGlobalUserBox(int position) { 
    ImageAdapter imageAdapter = new ImageAdapter(getContext()); 
    fragment.addInteger(imageAdapter.getmThumbIds(0)); // pass the Drawable's Integer value to the fragmnet 
    Toast.makeText(getActivity(), "Selected icon: " + imageAdapter.getmThumbIds(position), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_main_screen, container, false); 

    gridView = view.findViewById(R.id.gridViewLayout); 
    gridView.setAdapter(new ImageAdapter(getContext())); // used to set the contents of the GridView-in this case images- 
    registerForContextMenu(gridView); 

    // When an item from the GridView gets clicked 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // Create a new Intent... 
      Toast.makeText(getActivity(), "Position: " + position, Toast.LENGTH_SHORT).show(); 
      Intent intent = new Intent(getContext(),CardViewActivity.class); 
      intent.putExtra("Card Index",position); 
      intent.putExtra("SCREEN_WIDTH",1080); 
      startActivity(intent); 
     } 
    }); 
    return view; 
} 

} 

UserBoxGLBFragment.java:

public class UserBoxGLBFragment extends Fragment { 

GridView globalGridView; 
UserBoxGlbImageAdapter adapter = new UserBoxGlbImageAdapter(getContext()); 

public UserBoxGLBFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    Log.d("OnViewCreated:" , "OnViewCreated called successfully!"); 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_user_box_glb, container, false); 
    return view; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    globalGridView = view.findViewById(R.id.userBoxGlbGridView); 
    globalGridView.setAdapter(adapter); 
    Log.d("OnViewCreated:" , "OnViewCreated called successfully!"); 
} 

public void addInteger(Integer integer) { 
    adapter.addDrawableToList(integer); 
} 
} 
+0

haben Sie überprüfen Sie für Fehler Logcat? speziell wenn das zweite Fragment instanziiert wird? –

+0

yeah keine Fehler, aber ich bemerkte etwas seltsames, das onViewCreated tatsächlich aufgerufen wird, aber nicht das onCreateView? Wie ist das überhaupt möglich? –

+0

hast du Pause und Debugging benutzt? –

Antwort

-1

befestigen Debugger in onNavigationItemSelected bei Fall R.id.nav_UserBoxGLB: ob diese Methode Anrufe erhalten oder nicht.

und siehe NavigationView-Menü, ob es nav_UserBoxGLB-ID hat oder nicht.

und stellen Sie sicher, dass Ihre UserBoxGLBFragment ist erweitert durch android.support.v4.fragment.

+0

yup, es wird aufgerufen und ersetzt das Fragment erfolgreich! –

Verwandte Themen