2012-02-10 3 views
3

그래서 검색 조건 단락을 검색 기준으로 사용할 수 있으며 검색을 수행하면 검색 결과가 검색 결과 단편에 표시됩니다. 태블릿에서의 풍경에서는 두 조각이 자연스럽게 나란히 표시 될 수 있습니다. 지금까지는 구현하기가 간단합니다.조각을 번갈아 대화 상자에서 포함으로 전환 할 수 있습니까?

세로 방향 및 휴대 전화에서 검색 기준 조각을 검색 결과 옆의 팝업 대화 상자처럼 표시하고 싶습니다. DialogFragment의 Selecting Between Dialog or Embedding 섹션에서 조각을 포함하거나 대화 상자로 표시 할 수 있음을 알았습니다. 오리엔테이션 변경으로 인해 복잡하지 않으면이 기능이 저에게 효과적 일 수 있습니다.

활동에 대한 레이아웃에서 < 조각> XML 태그를 사용하는 경우 방향을 변경하면 여러 가지 문제가 발생합니다.

EDIT : 오늘 대화의 표시와 장치의 방향에 따라 끼어 들기를 전환하는 DialogFragment를 사용하여 간단한 워크 플로를 얻을 수 있는지 알아보기로 결정했습니다. 이것은 매우 어려워졌고, 나는 여전히 작동하는 것을 발견하지 못했습니다. 여기 내가 지금까지 가지고있는 것이있다. 나는 SearchCriteriaFragment의 정적 사본을 보관하고에서 onCreate가 활동에서 호출 될 때마다 그것을 다시 사용하지 않는

package org.nsdev.experiments; 

import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class FragmentSearchTestActivity extends FragmentActivity 
{ 
    private static SearchCriteriaFragment searchCriteriaFragment; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     View container = findViewById(R.id.search_criteria_container); 

     android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

     if (searchCriteriaFragment == null) 
     { 
      searchCriteriaFragment = SearchCriteriaFragment.newInstance(); 
      searchCriteriaFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); 
     } 

     android.support.v4.app.Fragment f = getSupportFragmentManager().findFragmentByTag("search_criteria"); 
     if (f != null) 
     { 
      ft.remove(f); 
     } 

     if (container == null) 
     { 
      searchCriteriaFragment.setCancelable(true); 
      searchCriteriaFragment.setHasOptionsMenu(false); 
      searchCriteriaFragment.show(getSupportFragmentManager(), "search_criteria"); 
     } 
     else 
     { 
      ft.remove(searchCriteriaFragment); 
      ft.add(R.id.search_criteria_container, searchCriteriaFragment, "search_criteria"); 
      ft.commit(); 
     } 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     if (item.getItemId() == R.id.menu_item_search) 
     { 
      searchCriteriaFragment.show(getSupportFragmentManager(), "search_criteria"); 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

는 특히 난 아무것도 작동을 얻을 수 없습니다. 이것은 나에게 아주 틀린 것처럼 보입니다.

SearchResultsFragment.java :

package org.nsdev.experiments; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class SearchResultsFragment extends android.support.v4.app.Fragment 
{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.results, container); 
    } 

} 

SearchCriteriaFragment.java :

package org.nsdev.experiments; 

import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class SearchCriteriaFragment extends android.support.v4.app.DialogFragment 
{ 

    private static final String TAG = "SearchCriteriaFragment"; 
    View v; 

    static SearchCriteriaFragment newInstance() 
    { 
     Log.e(TAG, "newInstance"); 
     SearchCriteriaFragment d = new SearchCriteriaFragment(); 
     return d; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     if (v == null) 
     { 
      v = inflater.inflate(R.layout.criteria, container, false); 
     } 
     else 
     { 
      if (v.getParent() instanceof ViewGroup) 
      { 
       Log.e(TAG, "Removing from viewgroup"); 
       ((ViewGroup)v.getParent()).removeAllViews(); 
      } 
     } 

     return v; 
    } 

} 

당신은 내가보기를 재사용하고 함께 문제를 해결해야한다고, 여기에서 볼 수 있습니다. 뷰에 이미 상위가 있었고 다른 상위에 추가 될 수 있기 전에 뷰에서 제거해야한다는 오류가있었습니다. 다시 말하지만, 나는 이것이 틀린 길을 가고있는 것처럼 보입니다.

고해상도/레이아웃/main.xml에 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/search_results" 
     android:name="org.nsdev.experiments.SearchResultsFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

고해상도/레이아웃 토지/main.xml에 :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <FrameLayout 
     android:id="@+id/search_criteria_container" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" /> 

    <fragment 
     android:id="@+id/search_results" 
     android:layout_toRightOf="@+id/search_criteria_container" 
     android:name="org.nsdev.experiments.SearchResultsFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

당신은 내가 뭘하려고,이 두 가지 레이아웃에서 볼 수 . 일반적인 방향에서 FrameLayout은 존재하지 않으므로이를 감지하고 DialogFragment를 표시 할 수 있습니다. 그렇지 않으면 DialogFragment를 FrameLayout에 포함시킬 수 있습니다.

마지막 두 개의 레이아웃 난 그냥 결과와 기준 레이아웃에 대한에 자리를 넣어했습니다

고해상도/레이아웃/criteria.xml :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:background="#300F"> 

    <CheckBox 
     android:id="@+id/checkBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="21dp" 
     android:paddingRight="30dp" 
     android:text="Test Criteria" /> 

</RelativeLayout> 

고해상도/레이아웃 /은 Results.xml :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:background="#f00"> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="16dp" 
     android:layout_marginTop="16dp" 
     android:text="Results" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

ICS 장치에서 장치를 회전하고 확인란을 선택하기 전까지는 알아 냈다고 생각했습니다. criteria.xml RelativeLayout 배경에 반투명하도록 색상을 설정했음을 주목하십시오.필자가 알아챈 점은 가로 방향의 경우 삽입 된 뷰가 실제로 뷰의 이전 버전을 유지하고 있었고 세로와 세로로 다시 전환 할 때마다 뷰의 새로운 복사본이 오버레이됩니다. 이것이 SeachCriteriaFragment의 onCreateView에서 반환 된 뷰의 복사본 하나만 유지하려고했던 이유 중 하나입니다. 이 문제는 해결되지 않습니다.

나는 한 가지 결론만을 내릴 수 있습니다. 나는 잘못하고 있어야합니다. 나는 프래그먼트 프레임 워크가 이러한 종류의 프래그먼트 재사용을 수행하도록 설계되지 않았다고 의심한다. Portrait에서 DialogFragment를 대화 상자로 표시하고 Landscape에 임베디드 된 멋진 회전을 어떻게 얻을 수 있습니까? 프레임 워크에서 이와 같이 자동으로 처리 할 수 ​​있습니까?

searchCriteriaFragment.setRetainInstance (true)를 설정하려고 시도했지만 모든 지옥이 느슨해 졌기 때문에 즉시 해당 행을 삭제했습니다.

나를 올바른 길로 안내하는 데 도움을 주셔서 감사합니다.

+0

회전 할 때 조각이 사라질 수있는 configChanges 특성 또는 활동 코드에 대해 뭔가가있을 수 있습니다. 최대한 많은 코드를 공유하는 것이 좋을 것 같습니다. – nmr

답변

0

나는 이것을 말할 것이다.

전화에서 SearchFormFragment를 활동으로 만들고 대화 상자 테마를 지정하십시오. 그런 다음 SearchResultsFragment는 자체 Activity이기도합니다.

<LinearLayout > 
    <fragment class="com.your.package.ui.fragment.SearchFormFragment" /> 
</LinearLayout> 

Dialog theme를 얻으려면 :

<manifest . . . > 
     <application . . . > 
     <activity 
      android:name=".ui.phone.SearchFormFragmentActivity" 
      android:theme="@android:style/Theme.Dialog" . . . > 
     <activity 
      android:name=".ui.phone.SearchResultsFragmentActivity" . . . > 

onSaveInstanceStateonRestoreInstanceState 및 활동의 라이프 사이클을 사용하여 방향 변경을 간단하게 같은

SearchForm XML을 보일 것입니다.

그런 다음 태블릿에 당신은 당신의 두 조각과 다른 활동을

  <activity 
      android:name=".ui.tablet.SearchFragmentActivity" . . . > 

SearchFragmentActivity.xml :.

<LinearLayout > 
    <fragment class="com.your.pacakage.ui.fragment.SearchFormFragment"/> 
    <fragment class="com.your.package.ui.fragment.SearchResultsFragment" /> 
    </LinearLayout> 

단순화.

+0

이상적으로 안드로이드 호환성 라이브러리와 UI 요소의 실제 조각을 사용하고 싶습니다. – Thorinside

+0

그게 정확히 무슨 뜻이야? 조각 xml을 편집하여 그 내용을 지우겠습니다. (단지 어쨌든 pseado입니다.) – Blundell

+0

하지만 두 가지 단편을 적절하게 관리하는 하나의 활동을 세 가지 활동으로 나누는 방법을 알고 싶습니다. – Thorinside

관련 문제