2017-01-07 4 views
0

Also versuche ich eine Suchfunktion in meiner App zu implementieren. Ich habe der Anwendungsleiste ein SearchView hinzugefügt und mein Manifest so konfiguriert, dass es die Absichten auf die richtigen Aktivitäten zeigt. Aber ich habe eine spezielle Situation: Ich möchte zusätzliche Informationen in die Absicht setzen, die das SearchView generiert, um es an meine SuchableActivity zu übergeben (in meinem Fall die SearchEventsActivity-Klasse). Um dies zu erreichen, wollte ich meine MainActivity-Klasse durchsuchbar machen, die Absicht mit onNewIntent() erfassen, die zusätzlichen Informationen in eine neue Absicht einfügen und diese verwenden, um meine eigentliche Suchaktivität zu starten. Aber aus irgendeinem Grund, obwohl ich ziemlich sicher bin, mein manifest ist richtig, onNewIntent() wird nie in MainActivity genanntAndroid SearchView weder durchsuchbare Aktivität gestartet noch onNewIntent() genannt

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.joshuaindustries.FindFun"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:launchMode="singleTop" 
      android:theme="@style/AppTheme.NoActionBar"> 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.app.default_searchable" 
       android:value=".MainActivity" 
       android:resource="@xml/searchable" /> 

     </activity> 

     <activity 
      android:name=".DetailsActivity" 
      android:label="@string/title_activity_details" 
      android:theme="@style/AppTheme.NoActionBar" ></activity> 

     <activity 
      android:name=".LoginActivity" 
      android:label="LoginActivity" 
      android:theme="@style/AppTheme.NoActionBar" ></activity> 

     <activity 
      android:name=".SearchEventsActivity" > 
     </activity> 
    </application> 

    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

MainActivity.class

package com.joshuaindustries.FindFun; 

import com.joshuaindustries.CustomFragments.ManageListFragment; 
import com.joshuaindustries.CustomFragments.OverviewListFragment; 
import com.joshuaindustries.netwerk.ManageEventsFetcher; 
import com.joshuaindustries.netwerk.OverviewEventsFetcher; 

import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.design.widget.TabLayout; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.content.SharedPreferencesCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 

import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 
    private final static String TAG = "MainActivity"; 

    private OverviewEventsFetcher overviewEventsFetcher; 
    private ManageEventsFetcher manageEventsFetcher; 
    private String userEmailAddress; 
    private String userPassword; 

    private OverviewListFragment overviewTabFragment; 
    private ManageListFragment manageTabFragment; 

    /** 
    * 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}. 
    */ 
    private SectionsPagerAdapter mSectionsPagerAdapter; 

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

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_main); 
     Intent activityIntent = getIntent (); 
     Bundle passedData = getIntent ().getExtras (); 

     /* Make sure we are (still) logged in 
     */ 
     SharedPreferences loginData = getSharedPreferences ("com.joshuaindustries.FindFun.loginData", Context.MODE_PRIVATE); 
     userEmailAddress = loginData.getString ("userEmailAddress", null); 
     userPassword = loginData.getString ("userPassword", null); 

     if ((userEmailAddress == null) || (userPassword == null)) { 
      Bundle passedLoginData = passedData; 

      if (passedLoginData == null) { 
       Intent loginIntent = new Intent (this, LoginActivity.class); 
       startActivity (loginIntent); 
      } else { 
       userEmailAddress = passedLoginData.getString ("userEmailAddress"); 
       userPassword = passedLoginData.getString ("userPassword"); 

       if ((userEmailAddress == null) || (userPassword == null)) { 
        Intent loginIntent = new Intent (this, LoginActivity.class); 
        startActivity (loginIntent); 
       } 
      } 
     } 

     /* Create our custom list fragment 
     */ 
     overviewTabFragment = new OverviewListFragment(); 
     manageTabFragment = new ManageListFragment (); 

     Toolbar toolbar = (Toolbar) findViewById (R.id.toolbar); 
     setSupportActionBar (toolbar); 
     getSupportActionBar ().setTitle ("FindFun"); 

     // 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.container); 
     mViewPager.setAdapter (mSectionsPagerAdapter); 

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

     FloatingActionButton fab = (FloatingActionButton) findViewById (R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 
    } 

    @Override 
    public void onStart () { 
     super.onStart (); 

     /* Get events data from server 
     */ 
     overviewEventsFetcher = new OverviewEventsFetcher (this, userEmailAddress, userPassword); 
     overviewEventsFetcher.fetch (); 
     overviewTabFragment.setUserCredentials (userEmailAddress, userPassword); 
     overviewTabFragment.setEventsFetcher (overviewEventsFetcher); 
     manageEventsFetcher = new ManageEventsFetcher (this, userEmailAddress, userPassword); 
     manageEventsFetcher.fetch (); 
     manageTabFragment.setUserCredentials (userEmailAddress, userPassword); 
     manageTabFragment.setEventsFetcher (manageEventsFetcher); 
    } 

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

    @Override 
    public void onNewIntent (Intent newIntent) { 
     Log.d (TAG, "onNewIntent started"); 
     if (Intent.ACTION_SEARCH.equals (newIntent.getAction ())) { 
      //Intent searchIntent = new Intent (Intent.ACTION_SEARCH, null, getApplicationContext (), SearchEventsActivity.class); 

      Intent searchIntent = new Intent (this, SearchEventsActivity.class); 
      searchIntent.putExtra ("userEmailAddress", userEmailAddress); 
      searchIntent.putExtra ("userPassword", userPassword); 
      searchIntent.putExtra (SearchManager.QUERY, newIntent.getStringExtra (SearchManager.QUERY)); 

      startActivity (searchIntent); 
     } 
    } 

    @Override 
    public void onStop () { 
     super.onStop (); 

     overviewEventsFetcher.onActivityStop (); 
    } 

    /** 
    * 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"; 

     public PlaceholderFragment() { 
     } 

     /** 
     * 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; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate (R.layout.fragment_overview, container, false); 
      TextView textView = (TextView) rootView.findViewById (R.id.section_label); 
      textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
      return rootView; 
     } 
    } 

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

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

     @Override 
     public Fragment getItem (int position) { 
      if (position == 0) { 
       return (overviewTabFragment); 
      } else if (position == 2) { 
       return (manageTabFragment); 
      } else { 
       return PlaceholderFragment.newInstance(position + 1); 
      } 
     } 

     @Override 
     public int getCount () { 
      /* We will have three tabs 
      */ 
      return (3); 
     } 

     @Override 
     public CharSequence getPageTitle (int position) { 
      /* We will have three tabs 
       - Overview: showing an overview of events the user can participate in 
       - Participations: allowing the user to manage his or her participations 
       - Manage: allowing the user to manage the events he/she creates himself 
      */ 
      switch (position) { 
       case (0): 
        return ("Overview"); 
       case (1): 
        return ("Participations"); 
       case (2): 
        return ("Manage"); 
       default: 
        return (null); 
      } 
     } 
    } 
} 

SearchEventsActivity. java

package com.joshuaindustries.FindFun; 

import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.RelativeLayout; 

import com.joshuaindustries.netwerk.OverviewEventsFetcher; 
import com.joshuaindustries.netwerk.SearchResultsEventsFetcher; 

/** 
* Created by Joshua on 7/01/2017. 
*/ 

public class SearchEventsActivity extends AppCompatActivity implements ListView.OnItemClickListener { 
    private static final String TAG = "SearchEventsActivityt"; 

    private static int nextSearchQueryID = 0; 

    private String userEmailAddress; 
    private String userPassword; 
    private String searchQuery; 
    private int searchQueryID; 

    private View viewRoot; 
    private ListView searchResultsList; 
    SearchResultsEventsFetcher eventsFetcher; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     Log.d (TAG, "search activity started"); 
     setContentView (R.layout.activity_search_events); 

     Intent searchIntent = getIntent (); 
     Bundle passedData = searchIntent.getExtras (); 

     userEmailAddress = passedData.getString ("userEmailAddress"); 
     userPassword = passedData.getString ("userPassword"); 
     searchQuery = passedData.getString (SearchManager.QUERY); 
     searchQueryID = SearchEventsActivity.nextSearchQueryID; 
     ++SearchEventsActivity.nextSearchQueryID; 

     eventsFetcher = new SearchResultsEventsFetcher (this, userEmailAddress, userPassword, searchQuery, searchQueryID); 
    } 

    @Override 
    public View onCreateView (String name, Context context, AttributeSet attributeSet) { 
     viewRoot = super.onCreateView (name, context, attributeSet); 
     searchResultsList = (ListView) viewRoot.findViewById (R.id.list_search_results); 
     searchResultsList.setOnItemClickListener (this); 
     searchResultsList.setAdapter (this.eventsFetcher.getEventListAdapter ()); 

     Button loadMoreResultsButton = new Button (this); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     layoutParams.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 
     loadMoreResultsButton.setLayoutParams (new AbsListView.LayoutParams (layoutParams)); 
     loadMoreResultsButton.setText ("Load more results ..."); 
     loadMoreResultsButton.setOnClickListener (
       new View.OnClickListener () { 
        SearchResultsEventsFetcher eventsFetcher; 

        public View.OnClickListener passEventsFetcher (SearchResultsEventsFetcher eventsFetcher) { 
         this.eventsFetcher = eventsFetcher; 

         return (this); 
        } 

        @Override 
        public void onClick (View view) { 
         eventsFetcher.fetch(); 
        } 
       }.passEventsFetcher (eventsFetcher) 
     ); 
     searchResultsList.addFooterView (loadMoreResultsButton); 

     return (viewRoot); 
    } 

    @Override 
    public void onItemClick (AdapterView listView, View view, int viewPosition, long rowID) { 
     Intent detailsIntent = new Intent (this, DetailsActivity.class); 
     detailsIntent.putExtra ("userEmailAddress", userEmailAddress); 
     detailsIntent.putExtra ("userPassword", userPassword); 
     eventsFetcher.putEventInIntent (detailsIntent, rowID); 

     startActivity (detailsIntent); 
    } 
} 

Searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_name" 
    android:hint="@string/search_hint" > 
</searchable> 

Ich habe die Lösungen here und here ohne Erfolg ...

geschätzt Jede Hilfe und/oder Vorschläge werden viel vorgeschlagen versucht!

Danke, Joshua

Antwort

1

Ich glaube, mein Problem ist, dass das SDK nicht meine durchsuchbare Konfiguration auf die Suche in meiner Tätigkeit instanziiert einen Anknüpfungspunkt. Ich habe keine Ahnung, warum das so ist, aber ich habe eine Abhilfe, nämlich tun, diese Kopplung programmatisch im onCreateOptionsMenu (Menü Menü) -Methode von MainActivity.java wie so:

SearchView searchView = (SearchView) menu.findItem (R.id.action_search).item.getActionView (); 
SearchManager searchManager = (SearchManager) getSystemService (Context.SEARCH_SERVICE); 
searchView.setSearchableInfo (searchManager.getSearchableInfo (getComponentName ())); 

Ich hoffe, das jemand in der Zukunft hilft:)

+0

Wenn jemand weiß, warum die Kopplung in den regulären Konfigurationsdateien nicht funktioniert, würde ich immer noch sehr glücklich sein zu lernen ... –

Verwandte Themen