2015-10-20 68 views
0

我想首先說我的搜索功能完全正常,並且在從我的主Activity中調用時功能完美。使用片段和viewpager實現選項卡布局後的工具欄問題

但是我正在開發一款應用程序,我希望在選擇搜索圖標時打開不同的活動,然後應該有兩個選項卡「引號」或「作者」。

選擇其中一個應該引用我創建的兩個片段,以便我可以搜索特定的引用或作者。

我操縱一個特定的sample我在gitHub上找到。問題是無論何時我在主要活動中選擇搜索圖標,都會引用我創建的搜索活動,但SearchView或設置菜單不可見,並且應該可見的片段選項卡也不存在,並且來自我的工具欄我無法回到主要活動中,我剛剛提到的所有這些活動都出現在工具欄中。 This is how it actually looks

我精確地跟蹤了示例項目,所以我只是很好奇我可能會丟失什麼,或者什麼可能是爲什麼工具欄中沒有任何可見的可能原因,即使所有的菜單項都已經膨脹並且執行得像主要活動?

這是搜索活動時動作搜索從主要活動

public class SearchActivity extends AppCompatActivity { 

private DrawerLayout mDrawerLayout; 

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    ActionBar ab = getSupportActionBar(); 
    ab.setHomeAsUpIndicator(R.drawable.ic_menu); 
    ab.setDisplayHomeAsUpEnabled(true); 


    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    if (navigationView != null) { 
     setupDrawerContent(navigationView); 
    } 

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
    if (viewPager != null) { 
     setupViewPager(viewPager); 
    } 


    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      mDrawerLayout.openDrawer(GravityCompat.START); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

private void setupViewPager(ViewPager viewPager) { 
    Adapter adapter = new Adapter(getSupportFragmentManager()); 
    adapter.addFragment(new AuthorSearchFragment(), "Quotes"); 
    adapter.addFragment(new QuoteSearchFragment(), "Authors"); 
    viewPager.setAdapter(adapter); 
} 

private void setupDrawerContent(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        menuItem.setChecked(true); 
        mDrawerLayout.closeDrawers(); 
        return true; 
       } 
      }); 
} 

static class Adapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

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

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

}

這裏選擇我參考的是我的主要活動,所有的菜單和搜索查看在工具欄中可見

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener { 
@Bind(R.id.toolbar) 
Toolbar mToolbar; 
private FragmentDrawer drawerFragment; 

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

    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    drawerFragment = (FragmentDrawer) 
      getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); 
    drawerFragment.setDrawerListener(this); 

    // display the first navigation drawer view on app launch 

    displayView(0); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

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

    if(id == R.id.action_search){ 
     //Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show(); 
     setContentView(R.layout.activity_search); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 



@Override 
public void onDrawerItemSelected(View view, int position) { 
    displayView(position); 
} 


private void displayView(int position) { 
    Fragment fragment = null; 
    String title = getString(R.string.app_name); 
    switch (position) { 
     case 0: 
      fragment = new HomeFragment(); 
      title = getString(R.string.title_home); 
      break; 
     case 1: 
      fragment = new FavoriteFragment(); 
      title = getString(R.string.nav_item_favorite_quote); 
      break; 
     case 2: 
      fragment = new AddQuoteFragment(); 
      title = getString(R.string.nav_item_add_quote); 
      break; 
     case 3: 
      fragment = new CategoryFragment(); 
      title = getString(R.string.nav_item_category); 
      break; 
     case 4: 
      fragment = new PhotoEditorFragment(); 
      title = getString(R.string.nav_item_photo_editor); 
      break; 
     case 5: 
      fragment = new AllAuthorsFragment(); 
      title = getString(R.string.nav_item_author); 
      break; 
     case 6: 
      fragment = new QuoteAlarmFragment(); 
      title = getString(R.string.nav_item_quote_alarm); 
      break; 
     case 7: 
      fragment = new MyQuotesFragment(); 
      title = getString(R.string.nav_item_my_quotes); 
      break; 
     case 8: 
      fragment = new QuotesFragment(); 
      title = getString(R.string.nav_item_quotes); 
      break; 
     default: 
      break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.container_body, fragment); 
     fragmentTransaction.commit(); 

     // set the toolbar title 
     getSupportActionBar().setTitle(title); 
    } 
} 

}

這是一個碎片ts應該是製表符按特定標準搜索

public class AuthorSearchFragment extends Fragment implements SearchView.OnQueryTextListener{ 

AuthorViewAdapter authorViewAdapter; 
List<AuthorAdapterModel> filteredAuthors; 
List<AuthorAdapterModel> beforeFilter; 
DrawableHelpers drawableHelpers = new DrawableHelpers(); 
List<Author> authorList; 


@Bind(R.id.recyclerView) 
RecyclerView recyclerView; 

private DbSeeder dbSeeder; 
public AuthorSearchFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.onCreate(savedInstanceState); 
    dbSeeder = new DbSeeder(getActivity()); 
    dbSeeder.checkDatabase(); 
} 

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

    View rootView = inflater.inflate(R.layout.fragment_author_search, container, false); 
    ButterKnife.bind(this, rootView); 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    setHasOptionsMenu(true); 

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    initializeData(); 
    initializeAdapter(); 
} 

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){ 
    inflater.inflate(R.menu.menu_main, menu); 

    final MenuItem item = menu.findItem(R.id.action_search); 
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); 
    searchView.setOnQueryTextListener(this); 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 

    final List<AuthorAdapterModel> filteredAuthors = filterAuthor(beforeFilter, query); 

    for (Author x : authorList) { 
     beforeFilter.add(new AuthorAdapterModel(
       drawableHelpers.getDrawableBasedOnName(x.getAuthorName(), "_author", "drawable", getActivity()) 
       , x.getMyQuotes().size(), x.getAuthorName())); 
    } 

     authorViewAdapter = new AuthorViewAdapter(filteredAuthors, getActivity()); 
     recyclerView.setAdapter(authorViewAdapter); 

    return false; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    return false; 
} 

public void initializeData(){ 
    authorList = new ArrayList<>(); 
    beforeFilter = new ArrayList<>(); 
    authorList = dbSeeder.GetAllAuthors(); 

    for (Author x : authorList) { 
     beforeFilter.add(new AuthorAdapterModel(
       drawableHelpers.getDrawableBasedOnName(x.getAuthorName(), "_author", "drawable", getActivity()) 
       , x.getMyQuotes().size(), x.getAuthorName())); 
    } 
} 

public void initializeAdapter(){ 
    authorViewAdapter = new AuthorViewAdapter(beforeFilter,getActivity()); 
    recyclerView.setAdapter(authorViewAdapter); 
} 

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

@Override 
public void onDetach() { 
    super.onDetach(); 
} 

private List<AuthorAdapterModel> filterAuthor(List<AuthorAdapterModel> authors, String query){ 
    query = query.toLowerCase(); 
    boolean found = false; 

    final List<AuthorAdapterModel> filteredAuthors = new ArrayList<>(); 
    for (AuthorAdapterModel author : authors) { 
     final String text = author.getAuthor().toLowerCase(); 
     if (text.contains(query)) { 
      filteredAuthors.add(author); 
      found = true; 
     } 
    } 

    if (found == false) { 
     Toast.makeText(getContext(), "This Author was not Found!", Toast.LENGTH_SHORT).show(); 
    } 
    return filteredAuthors; 
} 

回答

0

我解決了我之前遇到的問題。我在使用「setContentView」的主要活動類的「onOptionsItemSelected」函數中錯誤地調用了SearchActivity。

if(id == R.id.action_search){ 
    //Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show(); 
    setContentView(R.layout.activity_search); 
    return true; 
} 

我應該做的是創建一個引用和啓動SearchActivity的意圖。它現在完美地工作,因爲我最初的目的。

if(id == R.id.action_search){ 

     Intent intent = new Intent(MainActivity.this , SearchActivity.class); 
     startActivity(intent); 
     return true; 
    } 
相關問題