嗯,我是Android的新手,这是我的第一个应用程序,所以我认为我应该采取一个简单的项目。 该应用程序是一本书。您会看到标题列表,然后选择一个标题,然后会显示该标题的文本。 我希望设计的方式是当我添加新标题时,我最多在代码中的一个位置添加其名称。 我的第一个想法是开展两项活动。 “rootAct”显示列表,“title_viewAct”显示文章正文。它可以通过“rootAct”来完成,告诉title_viewAct选择了哪个标题,然后title_viewAct可以在相应的布局文件上调用setContentView()。 问题是这个设计是rootAct不能仅基于布局XML填充列表。我无法通过从资源中读取数据来找到以正确方式填充列表的方法。我应该为每个标题创建一个活动而不是使用一个活动吗?或者我可以创建{entry_name,entry_resource_name}对的全局列表,并使用entry_names填充列表,然后title_viewAct可以设置要显示的正确布局。
除了所有这些之外,还有在这里使用片段的地方吗?
问题是此应用程序的最佳设计模式是什么?
答案 0 :(得分:0)
您可以使用的设计模式是适配器模式。 android框架内置了适配器,可用于不同类型的List视图。基本上,您在xml中定义列表项的布局,该列表项对应于列表中的对象。然后,为适配器提供一个对象列表以及要表示这些对象的布局。适配器获取每个对象,将适当的信息插入列表项视图,然后将其加载到父列表中。查看https://github.com/codepath/android_guides/wiki/Using-the-RecyclerView以获取有关这些互动及其实施的详尽说明。
答案 1 :(得分:0)
我最终决定使用的设计如下: 该应用程序有一个文章/内容/条目列表,您可以选择和阅读。我们有一个根活动和一个标题视图。在根活动中,我创建了一个类来保存每篇文章的信息,现在这两个资源ID。一个ID用于在标题视图活动中显示布局,另一个用于文章的字符串资源。我还重写了toString()以返回文章标题字符串。 ArrayAdapter能够在列表中显示文章名称至关重要。 现在我每次添加一篇文章都应该:
当用户选择文章时,我会创建一个意图并将两个资源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);
}
}