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正在呼唤你的供应商之一,你不能控制它是如何去调用它。

我没有看到干净地做到这一点的方法。可搜索的内容与活动相关联。你要么立足于活动而不是片段(改变你的设计)的屏幕,或做等设定的偏好什么可怕的事情,当你恢复片段这样的内容提供者知道哪些片段是“积极的”。