安卓应用程序中分层内容的设计



我是android的新手,这是我的第一个应用程序,所以我想我应该做一个简单的项目。该应用程序是一本书。您会看到一个标题列表,然后选择一个标题,就会显示该标题的文本。我希望设计的方式是,当我添加一个新标题时,我最多在代码中的一个位置添加它的名称。我的第一个想法是有两个活动。"rootAct"显示列表,"title_viewAct"显示文章正文。这可以通过"rootAct"告诉title_viewAct选择了哪个标题来完成,然后title_vviewAct可以在适当的布局文件上调用setContentView()。这个设计的问题是rootAct不能单独基于布局XML来填充列表。我找不到通过从资源中读取数据来以正确的方式填充列表的方法。我应该为每个标题创建一个活动,而不是使用一个活动吗?或者,我可以创建一个由{entry_name,entry_resource_name}对组成的全局列表,并用entry_name填充列表,然后title_viewAct可以设置要显示的正确布局。

除了这些,这里还有使用碎片的地方吗?

问题是这个应用程序的最佳设计模式是什么?

您可以使用的设计模式是适配器模式。android框架中内置了适用于不同类型列表视图的适配器。基本上,您可以用xml定义与列表中的对象相对应的列表项的布局。然后,向适配器提供对象列表以及要表示这些对象的布局。适配器获取每个对象,将适当的信息插入列表项视图,然后将其加载到父列表中。查看https://github.com/codepath/android_guides/wiki/Using-the-RecyclerView,了解对这些交互及其实现的全面解释。

我最终决定使用的设计如下:该应用程序有一个文章/内容/条目列表,您可以选择并阅读。我们有一个根活动和一个标题视图。在根活动中,我创建了一个类来保存关于每篇文章的信息,目前是两个资源ID。一个ID用于在标题视图活动中显示的布局,另一个用于文章的字符串资源。我还重写了toString()以返回文章标题字符串。ArrayAdapter能够在列表中显示项目名称是至关重要的。现在,每次我添加一篇文章时,我都应该:

  1. 在字符串资源中为其命名
  2. 为其创建布局
  3. 通过"new"(实例化)ArticleClass将其添加到应用程序中的articles数组中

当用户选择一篇文章时,我会创建一个意向,并将两个资源IDS添加到它的附加部分中。

这是代码:

package com.siavoshkc.x;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.TintResources;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class RootActivity extends AppCompatActivity {
ListView rootListView;
class TitleEntry{
int layout_resID;
int str_resID;
TitleEntry(int name, int ID){
layout_resID= name;
str_resID=ID;
}
@Override
public String toString(){
return getResources().getString(str_resID);
}
}
final TitleEntry[] entry_items = {new TitleEntry(R.layout.title_data_input, R.string.TITLE_DATA_INPUT)};
RootActivity t = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_root);
ArrayAdapter<?> rootListArrAdapter = new ArrayAdapter<TitleEntry>(getApplication(),R.layout.list_text_view,R.id.list_view_text_element, entry_items);
rootListView = (ListView) findViewById(R.id.rootListView);
rootListView.setAdapter(rootListArrAdapter);
rootListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent toViewTitle = new Intent(t, EntryView.class);
//toViewTitle.putExtra(getString(R.string.TITLE_NO), position);
toViewTitle.putExtra(getString(R.string.TITLE_LAYOUT_ID), entry_items[position].layout_resID);
toViewTitle.putExtra(getString(R.string.TITLE_STRING_ID), entry_items[position].str_resID);
startActivity(toViewTitle);
}
});
}
}

以及EntryView活动:

package com.siavoshkc.x;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
public class EntryView extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
//RootActivity root = (RootActivity) getParent();
//RootActivity.TitleEntry[] entry_list=root.GetEntryList();
//int iNo = intent.getIntExtra(getString(R.string.TITLE_NO), -1);
int strID = intent.getIntExtra(getString(R.string.TITLE_STRING_ID), -1);
int layoutID = intent.getIntExtra(getString(R.string.TITLE_LAYOUT_ID), -1);
setTitle(strID);
setContentView(layoutID);
}
}

最新更新