【问题标题】:Design for hierarchical content in android appandroid 应用中分层内容的设计
【发布时间】:2016-06-10 13:53:41
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我已经有了适配器代码。问题是适配器的来源。如果我只为每个标题条目定义一个布局 xml,那么适配器将无法找到列表条目的名称。因为它无法读取 xml 元素内部(除非您尝试解析应用程序中的 xml,我决定暂时不这样做)。
    【解决方案2】:

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

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

    当用户选择一篇文章时,我会创建一个意图并将两个资源 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多