2014-12-05 32 views
0

我在我的操作欄中有一個編輯文本。但是當我切換到另一個片段時,edittext保持不變。 我想只在一個片段中擁有edittext。 加上它似乎隱藏了actiobar標題:/ 請幫助我。 (感謝)(android)編輯文本在操作欄片段

這是我的代碼:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
{ 
    menu.clear(); 
    inflater.inflate(R.menu.menu_tab1, menu); 
    ActionBar actionBar = getActivity().getActionBar(); 
    // add the custom view to the action bar 
    actionBar.setCustomView(R.layout.search); 
    search = (EditText) actionBar.getCustomView().findViewById(R.id.search_user); 

    search.setOnEditorActionListener(new OnEditorActionListener() 
    { 

     @Override 
     public boolean onEditorAction(TextView v, int actionId, 
      KeyEvent event) 
     { 
      try 
      { 
        //TASKS 
       } 
      catch(Exception e) 
      { 
      Toast.makeText(Tab1.this.getActivity(), "Problem. Please restart the app", Toast.LENGTH_LONG).show(); 
      } 
      return false; 
     } 
    }); 
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM 
      | ActionBar.DISPLAY_SHOW_HOME); 

    super.onCreateOptionsMenu(menu, inflater); 
} 

回答

1

我張貼你的活動的一個簡單的例子,每3個標籤由片段表示。每個片段都將其自己的項目添加到操作欄。第一個片段添加圖標,第二個片段添加edittext視圖,第三個片段添加任何內容。當特定片段可見時,只有該片段操作項目在操作欄上可見。

MainActivity.java

package com.example.user.actionbartabs; 

import java.util.Locale; 

import android.app.Activity; 
import android.support.v4.view.MenuItemCompat; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.os.Bundle; 
import android.support.v4.view.ViewPager; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.TextView; 


public class MainActivity extends ActionBarActivity implements ActionBar.TabListener { 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link FragmentPagerAdapter} derivative, which will keep every 
    * loaded fragment in memory. If this becomes too memory intensive, it 
    * may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    SectionsPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    ViewPager mViewPager; 

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

     // Set up the action bar. 
     final ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(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); 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a PlaceholderFragment (defined as a static inner class below). 
      return PlaceholderFragment.newInstance(position + 1); 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
       case 0: 
        return getString(R.string.title_section1).toUpperCase(l); 
       case 1: 
        return getString(R.string.title_section2).toUpperCase(l); 
       case 2: 
        return "Section 3".toUpperCase(l); 
      } 
      return null; 
     } 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     private static final String ARG_SECTION_NUMBER = "section_number"; 

     private int sectionNumber; 

     /** 
     * Returns a new instance of this fragment for the given section 
     * number. 
     */ 
     public static PlaceholderFragment newInstance(int sectionNumber) { 
      PlaceholderFragment fragment = new PlaceholderFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     public PlaceholderFragment() { 
     } 

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

     @Override 
     public void onAttach (Activity activity) { 
      super.onAttach(activity); 
      setHasOptionsMenu(true); 
     } 

     @Override 
     public void onActivityCreated(Bundle bundle) { 
      super.onActivityCreated(bundle); 
      ((TextView) getView().findViewById(R.id.section_label)).setText(Integer.toString(sectionNumber)); 
     } 

     @Override 
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      switch(sectionNumber) { 
       case 1: 
        inflater.inflate(R.menu.menu_section1, menu); 
        break; 
       case 2: 
        inflater.inflate(R.menu.menu_section2, menu); 
        EditText editText = (EditText) MenuItemCompat.getActionView(menu.findItem(R.id.action_settings)); 
        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() 
        { 
         @Override 
         public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
         { 
          //Do something here 
          return false; 
         } 
        }); 
        break; 
       case 3: 
        inflater.inflate(R.menu.menu_section3, menu); 
        break; 
       default: 
        break; 
      } 
      //Set action bar title 
      ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Section " + sectionNumber); 
     } 
    } 

} 

activity_main.xml中

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    tools:context=".MainActivity" /> 

fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity$PlaceholderFragment"> 

    <TextView android:id="@+id/section_label" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

action_item_edit_text.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/editInput" 
    android:layout_width="140dp" 
    android:layout_height="?attr/actionBarSize" 
    android:hint="Write something" 
    android:singleLine="true" 
    android:background="@android:color/white" 
    android:textColorHint="#BBBBBB" 
    android:textColor="@android:color/black" 
    android:textSize="14sp" 
    android:padding="6dp"/> 

menu_section1.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/action_settings" android:icon="@drawable/abc_ic_ab_back_mtrl_am_alpha" 
     app:showAsAction="always" /> 
</menu> 

menu_section2.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/action_settings" app:actionLayout="@layout/action_item_edit_text" 
     app:showAsAction="always" /> 
</menu> 

menu_section3.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 

</menu> 

注意,由於API級別21使用與操作欄標籤已經過時,所以你可能想禁用它們,只能堅持查看尋呼機。我張貼了標籤的例子,因爲你在你的問題中提到了它們。