그래서 검색 조건 단락을 검색 기준으로 사용할 수 있으며 검색을 수행하면 검색 결과가 검색 결과 단편에 표시됩니다. 태블릿에서의 풍경에서는 두 조각이 자연스럽게 나란히 표시 될 수 있습니다. 지금까지는 구현하기가 간단합니다.조각을 번갈아 대화 상자에서 포함으로 전환 할 수 있습니까?
세로 방향 및 휴대 전화에서 검색 기준 조각을 검색 결과 옆의 팝업 대화 상자처럼 표시하고 싶습니다. 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)를 설정하려고 시도했지만 모든 지옥이 느슨해 졌기 때문에 즉시 해당 행을 삭제했습니다.
나를 올바른 길로 안내하는 데 도움을 주셔서 감사합니다.
회전 할 때 조각이 사라질 수있는 configChanges 특성 또는 활동 코드에 대해 뭔가가있을 수 있습니다. 최대한 많은 코드를 공유하는 것이 좋을 것 같습니다. – nmr