布局设计标签/值详细信息到标签/值编辑

时间:2018-02-07 14:03:03

标签: android android-layout

长期的Web开发人员开始本机android开发。 苦苦挣扎于我认为对于新手来说是一个非常普遍的问题。

问题:我有一个详细信息屏幕,可以编辑详细信息。单击编辑按钮导航到“编辑”屏幕。这些视图基本相同,除了详细信息屏幕是只读的和编辑屏幕,其中每个字段都是可编辑的。

Example layout

我在这里阅读了材料设计指南 https://material.io/guidelines/components/text-fields.html#text-fields-layout并详细介绍了如何设计可编辑字段。

我还在这里阅读了TextInputLayout: https://www.androidhive.info/2015/09/android-material-design-floating-labels-for-edittext/

我可以为Detail屏幕上的每个标签/值字段模拟TextInputLayout(参见示例布局),但是,这似乎很多工作。

我认为理想情况下,重新使用“编辑”表单字段非常方便,但只需将它们标记为“详细信息”屏幕的只读。

我想问安卓大师那里有“正确的方法”来实现这一目标。我宁愿不破解一个解决方案。当然,这个坚果之前已被破解,但显然我的谷歌搜索技能还不足以找到它。

3 个答案:

答案 0 :(得分:1)

您可以使用以下说明禁用EditText字段:

https://stackoverflow.com/a/33582335/3268303

应用程序通常会共享添加/编辑屏幕,但不一定是查看/编辑。

添加/编辑共享的示例如下:

https://github.com/googlesamples/android-architecture/tree/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/addedittask

public class AddEditTaskPresenter implements AddEditTaskContract.Presenter,
    TasksDataSource.GetTaskCallback {

@NonNull
private final TasksDataSource mTasksRepository;

@NonNull
private final AddEditTaskContract.View mAddTaskView;

@Nullable
private String mTaskId;

private boolean mIsDataMissing;

/**
 * Creates a presenter for the add/edit view.
 *
 * @param taskId ID of the task to edit or null for a new task
 * @param tasksRepository a repository of data for tasks
 * @param addTaskView the add/edit view
 * @param shouldLoadDataFromRepo whether data needs to be loaded or not (for config changes)
 */
public AddEditTaskPresenter(@Nullable String taskId, @NonNull TasksDataSource tasksRepository,
        @NonNull AddEditTaskContract.View addTaskView, boolean shouldLoadDataFromRepo) {
    mTaskId = taskId;
    mTasksRepository = checkNotNull(tasksRepository);
    mAddTaskView = checkNotNull(addTaskView);
    mIsDataMissing = shouldLoadDataFromRepo;

    mAddTaskView.setPresenter(this);
}

@Override
public void start() {
    if (!isNewTask() && mIsDataMissing) {
        populateTask();
    }
}

@Override
public void saveTask(String title, String description) {
    if (isNewTask()) {
        createTask(title, description);
    } else {
        updateTask(title, description);
    }
}

@Override
public void populateTask() {
    if (isNewTask()) {
        throw new RuntimeException("populateTask() was called but task is new.");
    }
    mTasksRepository.getTask(mTaskId, this);
}

@Override
public void onTaskLoaded(Task task) {
    // The view may not be able to handle UI updates anymore
    if (mAddTaskView.isActive()) {
        mAddTaskView.setTitle(task.getTitle());
        mAddTaskView.setDescription(task.getDescription());
    }
    mIsDataMissing = false;
}

@Override
public void onDataNotAvailable() {
    // The view may not be able to handle UI updates anymore
    if (mAddTaskView.isActive()) {
        mAddTaskView.showEmptyTaskError();
    }
}

@Override
public boolean isDataMissing() {
    return mIsDataMissing;
}

private boolean isNewTask() {
    return mTaskId == null;
}

private void createTask(String title, String description) {
    Task newTask = new Task(title, description);
    if (newTask.isEmpty()) {
        mAddTaskView.showEmptyTaskError();
    } else {
        mTasksRepository.saveTask(newTask);
        mAddTaskView.showTasksList();
    }
}

private void updateTask(String title, String description) {
    if (isNewTask()) {
        throw new RuntimeException("updateTask() was called but task is new.");
    }
    mTasksRepository.saveTask(new Task(title, description, mTaskId));
    mAddTaskView.showTasksList(); // After an edit, go back to the list.
}
}

答案 1 :(得分:1)

显示和编辑文本EditText是完全可以的解决方案。您只需调用setEnabled()上的TextInputLayout方法即可在这些状态之间切换。从UX角度来看,最好更改文本的颜色,并仅在启用模式下显示该行。可以使用Android的状态资源来实现设计。

答案 2 :(得分:0)

为什么我要做的是根据当前视图的类型以编程方式更改元素的输入类型。如果是编辑视图,我只使用默认值。另一方面,我以这种方式改变输入类型。

editText1.setText("Your value text here");

editText1.setInputType(InputType.TYPE_NULL); 

我认为这很简单,效果很好