0

我已經在操作欄中實現了一個微調器,以便在顯示fragment-1時顯示。當這個片段消失時,我希望它消失或停用。如何禁用離開碎片時在ActionBar中的微調器菜單項?

問題是,如果我在碎片1的頂部啓動另一個碎片2(如附圖所示的屏幕所示),那麼微調器仍然以條形顯示。有類似的帖子(不完全像項目一樣微調)。我要麼試過它們,不成功,要麼我不明白如何將它們應用於我的案例。如果您看到任何類似的帖子,請標記爲重複。

這是我menu.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/menuReports" 
     android:title="@string/reports_menu_title" 
     app:actionLayout="@layout/layout_reports_menu" 
     android:name="android:spinnerItemStyle" 
     app:showAsAction="always"> 
    </item> 
</menu> 

片段:

public class MyFragment extends android.support.v4.app.Fragment { 
    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.menu_reports, menu); 
     mSpinnerItem = menu.findItem(R.id.menuReports); 

     SpinnerAdapter spinnerAdapter = ArrayAdapter.createFromResource(((AppCompatActivity) getActivity()).getSupportActionBar() 
       .getThemedContext(), R.array.reports_types, android.R.layout.simple_spinner_dropdown_item); 
    final Spinner spinner = (Spinner) MenuItemCompat.getActionView(mSpinnerItem); 

    spinner.setAdapter(spinnerAdapter); 

    spinner.setMinimumWidth((int) Converter.convertDpToPixels(getActivity(), 
      getResources().getDimension(R.dimen.report_spinner_selected_item_width))); 
    spinner.setPadding(0, 0, (int) Converter.convertDpToPixels(getActivity(), 30), 0); 

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      Log.d(TAG, "No Item selected.."); 
     } 
    }); 
} 
} 

下面是杆的兩個鏡頭 - 從片段-1第一個,然後從片段2。讓我知道你是否有任何想法。

enter image description here

enter image description here

UPDATE

我試過setDisable()上的微調項英熱單位,沒有工作。

回答

1

設置菜單的最佳位置是onPrepareOptionsMenu(Menu menu)。您可以通過致電menu.findItem(R.id.menu_item).setVisible(false);隱藏單個菜單項。

小例子:

boolean isVisible = true; 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.menu_item).setVisible(isVisible); 
    return super.onPrepareOptionsMenu(menu); 
} 

private void hideMenuItem() { 
    isVisible = false; 
    invalidateOptionsMenu(); 
} 

另一個例子(我們稱之爲onPrepareOptionsMenu()內片段):

public class MainActivity extends AppCompatActivity { 

    public static final String KEY_TYPE = "key_type"; 

    public static final String TYPE_ACTION = "type_action"; 
    public static final String TYPE_NO_ACTION = "type_no_action"; 

    private FragmentManager fragmentManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     fragmentManager = getSupportFragmentManager(); 
     addFragment(TYPE_NO_ACTION); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
/* 
    <menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
     <item 
      android:id="@+id/menu_add" 
      android:title="Add" 
      app:showAsAction="ifRoom" /> 
    </menu> 
*/ 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_add: 
       addFragment(TYPE_ACTION); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     if (fragmentManager.getBackStackEntryCount() > 0) { 
      fragmentManager.popBackStack(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    private void addFragment(String type) { 
     Bundle bundle = new Bundle(); 
     bundle.putString(KEY_TYPE, type); 

     ExampleFragment fragment = new ExampleFragment(); 
     fragment.setArguments(bundle); 

     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(android.R.id.content, fragment); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

    public static class ExampleFragment extends Fragment { 

     private String type; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      type = getArguments().getString(KEY_TYPE, TYPE_NO_ACTION); 
      setHasOptionsMenu(true); 
     } 

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

     @Override 
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
/* 
     <menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto"> 
      <item 
       android:id="@+id/menu_action" 
       android:title="Action" 
       app:showAsAction="ifRoom" /> 
     </menu> 
*/ 
     inflater.inflate(R.menu.menu_fragment, menu); 
     } 

     @Override 
     public void onPrepareOptionsMenu(Menu menu) { 
      MenuItem item = menu.findItem(R.id.menu_action_fragment); 
      item.setVisible(type.equals(TYPE_ACTION)); // hide if type != TYPE_ACTION 
      super.onPrepareOptionsMenu(menu); 
     } 
    } 
} 
+0

謝謝!是的,我也試過這個。但我沒有得到在哪裏設置isVisible錯誤。片段1的onStop()不會被調用,因爲我替換()了片段。 – cgr

+0

正如我所提到的,我想隱藏微調器,當這個片段變得不可見時,所以它不會顯示在其他片段中。 – cgr

+0

您可以在活動級別的replace()之後調用它,或者覆蓋這兩個片段中的onPrepareOptionsMenu()並將其設置在那裏。 –

相關問題