1

我有一個activity,其中TabLayout與迷住FragmentPagerAdapter。每當用戶更改制表符時,將加載另一個片段,但Activity保持不變。 activity也包含一個搜索功能,即從Web服務器獲取自動完成建議。我想要執行不同的搜索操作 - 基本上,查詢另一個URL - 取決於當前在FragmentPager/TabLayout中加載哪個片段。到目前爲止,我還沒有找到任何方法來做到這一點。以下是我所嘗試的:根據活動片段更改活動中的搜索功能

  • 當前,搜索功能已連接到內容提供者(通過manifest和searchable.xml)。但是,我還沒有找到一種方法將數據傳遞給這個ContentProvider的讓它使用多個內容提供商似乎並不可能,因爲只能有一個對於任何給定的活動知道哪個選項卡中選擇
  • ,和不應該活動選擇另一個選項卡
  • 操縱活動的onQueryText *方法時,改變的是不可行的,因爲我不想阻止用戶界面線程獲取數據

這裏的速寫情況:Sketch

以下是相關代碼片段:

MainActivity.class

public class MainActivity extends AppCompatActivity { 
    private ViewPager mViewPager; 

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

     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mViewPager.setAdapter(new MainFragmentPagerAdapter(getSupportFragmentManager(), 
       MainActivity.this)); 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.action_search, menu); 


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

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, MainActivity.class))); 
     searchView.setIconifiedByDefault(false); 

     return true; 
    } 

    /* ... */ 
} 

菜單/ action_search.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/action_search" 
     android:title="Search" 
     android:icon="@android:drawable/ic_menu_search" 
     app:showAsAction="always" 
     app:actionViewClass="android.support.v7.widget.SearchView" /> 
</menu> 

XML/searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:hint="hint" 
    android:label="@string/app_name" 
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" 
    android:searchSuggestAuthority="xyz.demo.search.datasuggestion" 
    android:searchSuggestIntentAction="android.intent.action.VIEW" 
    android:searchSuggestIntentData="content://xyz.demo.search.data"/> 

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xyz.demo.app"> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".MainActivity" /> 
     <activity android:name=".MainActivity" android:launchMode="singleTop"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <action android:name="android.intent.action.SEARCH" /> 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 
     </activity> 

     <provider 
      android:name=".SuggestionProvider" 
      android:authorities="xyz.demo.search.datasuggestion" 
      android:enabled="true" 
      android:exported="true"/> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET"/> 
</manifest> 

SuggestionProvider.java

public class SuggestionProvider extends ContentProvider { 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
         String[] selectionArgs, String sortOrder) { 

      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder() 
        .url(".../suggestions") 
        .build(); 

      try { 
       Response response = client.newCall(request).execute(); 
       String jsonString = response.body().string(); 
       JSONArray jsonArray = new JSONArray(jsonString); 

       /* ... */ 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      /* ... eventually returns a MatrixCursor */ 
    } 

    /* ... */ 
} 

回答

1

沒關係啊我認爲這是那些東西,其中Android正在呼喚你的供應商之一,你不能控制它是如何去調用它。

我沒有看到乾淨地做到這一點的方法。可搜索的內容與活動相關聯。你要麼立足於活動而不是片段(改變你的設計)的屏幕,或做等設定的偏好什麼可怕的事情,當你恢復片段這樣的內容提供者知道哪些片段是「積極的」。