Два вопроса о шаблоне Master/Detail Flow
Я только что посмотрел шаблон Master/Detail Flow, и я не могу понять 2 вещи.
1) Зачем нужен Android версии 11, когда генерируемый код, похоже, поддерживает поддержку совместимости с фрагментами? В частности, почему вы не можете создавать шаблоны, запускаемые с Android версии 8? (например, этот импорт)
import android.support.v4.app.FragmentActivity;
2) Как основная активность знает, показывать ли детали в новой деятельности или в панели сведений, если она достаточно велика? Кажется, это делается с помощью этого кода:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item_list);
if (findViewById(R.id.item_detail_container) != null) {
mTwoPane = true;
((ItemListFragment) getSupportFragmentManager()
.findFragmentById(R.id.item_list))
.setActivateOnItemClick(true);
}
}
setContentView(R.layout.activity_item_list);
устанавливает макет в ListFragment
, который просто устанавливает свой собственный адаптер, но я не вижу, как findViewById(R.id.item_detail_container) != null
когда-либо вернет true, так как он никогда не открывается или раздувается.
Любые подсказки?
Ответы
Ответ 1
После долгих поисков ответ из-за этого в values-large/refs.xml
<resources>
<item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
</resources>
Он перенаправляет запрос на нормальный макет на более крупный макет (двухпанельная версия), где R.id.item_detail_container
определен.
Это довольно запутанно. Я не уверен, почему они просто не назовет большой макет так же, как обычный макет, но затем имеют разные xml.
Ответ 2
Вот что сработало для меня.
1) Добавьте ActionBarSherlock в проект: Project → Properties → Android → Выберите ActionBarSherlock и нажмите кнопку "Добавить". Если у вас нет АБС, вам нужно получить его от http://actionbarsherlock.com/, прежде чем продолжить.
2) "AndroidManifest.xml": установите minSdkVersion на 10 (Gingerbread). Я думаю, вы можете пойти еще ниже этого.
android:minSdkVersion="10"
3) "activity_item_list.xml": просто удалите "list_content", потому что Eclipse продолжает жаловаться, что вам нужен сотовый или более поздний.
tools:layout="@android:layout/list_content" <-- remove
4) "activity_item_twopane.xml": удалить линии сотового или более позднего.
android:divider="?android:attr/dividerHorizontal" <-- remove
tools:layout="@android:layout/list_content" <-- remove
5) ItemListActivity.java: используйте функцию SherlockFragmentActivity.
//public class ItemListActivity extends FragmentActivity implements
public class ItemListActivity extends SherlockFragmentActivity implements
6) ItemListFragment.java: изменение параметров в setListAdapter().
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: replace with a real list adapter.
//setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
// android.R.layout.simple_list_item_activated_1,
// android.R.id.text1, DummyContent.ITEMS));
int layout = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ?
android.R.layout.simple_list_item_activated_1 :
android.R.layout.simple_list_item_checked;
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
layout, DummyContent.ITEMS));
}
7) "ItemDetailActivity.java": используйте функцию "Шерлок" и "getSupportActionBar" ().
//public class ItemDetailActivity extends FragmentActivity {
public class ItemDetailActivity extends SherlockFragmentActivity {
...
//getActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
После внесения изменений приложение работало в Gingerbread, ICS и Jelly Bean.
__
Золь
Ответ 3
с уважением в вашем первом вопросе:
вам нужно изменить класс ItemListFragment
:
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
R.layout.simple_list_item_activated_1,
R.id.text1,
DummyContent.ITEMS));
для этого:
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
R.layout.simple_list_item_1,
R.id.text1,
DummyContent.ITEMS));
И прокомментируйте в ItemDetailActivity
эту строку:
// getActionBar().setDisplayHomeAsUpEnabled(true);
Ответ 4
Я думаю, что для шаблона Master/Detail Flow требуется уровень api 11, потому что он использует панель действий. Я попытаюсь использовать этот шаблон с ActionBarSherlcock и посмотреть, работает ли он с Android 2.2 или 2.3.
Ответ 5
Что касается первого вопроса, то одной из причин, по которой он требует V11, является то, что он использует list_content и не входит в библиотеку совместимости. Обход для этого здесь.
Ответ 6
Техника, используемая во второй части вашего вопроса, является примером Alias Layout.