0

Dans mon application, j'ai créé quelques boutons dans un fragment qui redirigera vers plusieurs activités en fonction du clic. Maintenant, si l'utilisateur clique sur le bouton 1, il obtiendra un menu contextuel flottant qui contiendra la liste des composants, comme company1, compan2 ... etc. J'ai suivi ce poste Opening a floating menu (context menu) in Android? pour développer cette fonctionnalité dans mon application. Mais le problème est que ce code est implémenté dans Activity, où dans mon cas je veux l'implémenter dans Fragment. J'ai écrit le code, mais rien ne se passe avec le bouton. Maintenant, comment puis-je générer ce menu sur le bouton cliquezMenu contextuel flottant sur le bouton cliquer à l'intérieur Fragment

Mon contextmenu est

<?xml version="1.0" encoding="utf-8"?> 

<item android:id="@+id/company_1" 
    android:title="@string/company_1"></item> 

<item android:id="@+id/company_2" 
android:title="@string/company_2"></item> 

<item android:id="@+id/company_3" 
android:title="@string/company_3"></item> 

<item android:id="@+id/company_4" 
    android:title="@string/company_4"> 
</item> 
<item android:id="@+id/company_5" 
    android:title="@string/company_5"></item> 

<item android:id="@+id/company_6" 
    android:title="@string/company_6"> 
</item> 

Mon Fragment classe est

public class MainFragment extends Fragment implements View.OnClickListener{ 


public MainFragment() { 
    // Required empty public constructor 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_main, container, false); 

    Button button1=(Button) view.findViewById(R.id.button1); 
    button1.setOnClickListener(this); 
    registerForContextMenu(button); 
    Button button2=(Button) view.findViewById(R.id.button2); 
    button2.setOnClickListener(this); 
    Button button3=(Button) view.findViewById(R.id.button3); 
    button3.setOnClickListener(this); 

    // Inflate the layout for this fragment 
    return view; 

} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    if(v.getId()==R.id.button1){ 
     this.getActivity().getMenuInflater().inflate(R.menu.contextmenu_company,menu); 
    } 
    super.onCreateContextMenu(menu, v, menuInfo); 

} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    setHasOptionsMenu(true); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.company_1: 
      Toast.makeText(getActivity().getApplicationContext(),"caompany1code",Toast.LENGTH_LONG).show(); 
      return true; 
     case R.id.company_2: 
      ...... 
     case R.id.company_3: 
      ..... 
     case R.id.company_4: 
      .... 
      return true; 
     case R.id.company_5: 
      ..... 
      return true; 
     case R.id.company_6: 
      ..... 
      return true; 
    } 
    return super.onContextItemSelected(item); 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.button1: 

      Toast.makeText(getActivity(),"My colleagues clicked", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.button2: 
      Toast.makeText(getActivity(), "News clicked", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.button3: 
      Toast.makeText(getActivity(), "Navigator clicked", Toast.LENGTH_SHORT).show(); 
      break; 

    } 

} 

Dans MainActivity classe

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

NavigationView navigationView = null; 
Toolbar toolbar = null; 

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


    //Set the fragment initially 
    MainFragment fragment = new MainFragment(); 
    android.support.v4.app.FragmentTransaction fragmentTransaction = 
      getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.replace(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    navigationView = (NavigationView) findViewById(R.id.nav_view); 

    navigationView.setNavigationItemSelectedListener(this); 

} 
@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 


    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    ..... 

} 

Répondre

0

Eh bien je l'ai trouvé quelque chose:

Essayez dans votre fragment:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) { 
if(v.getId()==R.id.button1{getActivity().getMenuInflater().inflate(R.menu.contextmenu_company,menu); 
} 
} 

Vous appelez aussi ce mal:

//Instead of button use button1. 
registerForContextMenu(button1); 

Peut-être que cela aidera.

+0

l'expression est attendue dans le menu R.menu.contextmenu_company, menu –

+0

Appelez la super méthode aussi comme vous l'avez fait. Juat change le menu registerforcontext et il est supposé fonctionner sur un clic long. –

+0

Je l'ai fait. mais rien ne se passe dans mon bouton 1 –

0

Tu as fait utiliser

onCreateOptionsMenu (menu Menu)

dans votre activité, mais vous essayez d'utiliser

onCreateContextMenu (Menu ContextMenu, Vue v, ContextMenu. ContextMenuInfo menuInfo)

dans votre fragment.

Utilisez également le menu OnCreateOptions (menu Menu) de votre fragment et définissez setHasOptionsMenu (true) dans votre méthode onCreateView.

+0

Oui. J'ai fait ça. mais encore ce n'est pas shwing. J'ai mis à jour mon code –

+0

Aussi je veux obtenir un menu contextuel/menu contextuel sur le clic du bouton. c'est pourquoi j'utilise sur créer un menu contextuel –

+0

Vous devez définir setHasOptionsMenu (true) dans votre onCreateView() pas dans votre onCreateOptionsMenu()! Ce que vous voulez semble être un PopupMenu. Jetez un oeil sur [ceci] (https://www.javatpoint.com/android-popup-menu-example) –