在Android应用程序中设计分层内容

时间:2016-06-10 13:53:42

标签: android android-layout design-patterns android-resources

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

除了所有这些之外,还有在这里使用片段的地方吗?

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

2 个答案:

答案 0 :(得分:0)

您可以使用的设计模式是适配器模式。 android框架内置了适配器,可用于不同类型的List视图。基本上,您在xml中定义列表项的布局,该列表项对应于列表中的对象。然后,为适配器提供一个对象列表以及要表示这些对象的布局。适配器获取每个对象,将适当的信息插入列表项视图,然后将其加载到父列表中。查看https://github.com/codepath/android_guides/wiki/Using-the-RecyclerView以获取有关这些互动及其实施的详尽说明。

答案 1 :(得分:0)

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

  1. 在字符串资源中为其命名。
  2. 为其创建布局。
  3. 通过“新建”(实例化)ArticleClass将其添加到App中的articles数组中。
  4. 当用户选择文章时,我会创建一个意图并将两个资源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);
        }
    }