【问题标题】:LinearLayout with animation changes my sub-layout items on Android带有动画的 LinearLayout 更改了我在 Android 上的子布局项
【发布时间】:2014-08-17 14:52:26
【问题描述】:

你好吗?

我有一个问题,我尝试了很多次来解决它。但我没有成功。让我们来解决问题:

我列出了一些“任务”,最初我是这样做的:

布局/fragment_list.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ProgressBar
        android:id="@+id/loading_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_gravity="center" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_gravity="center_horizontal" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textStyle="bold"
        android:id="@+id/no_item_message"
        android:visibility="invisible" />

</LinearLayout>

List的项目是

布局/tasks.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:showDividers="middle"
android:divider="?android:dividerVertical">

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/task_checkbox"
        android:clickable="true"
        android:enabled="true"
        android:singleLine="false"
        android:gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:visibility="visible"/>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="245dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:id="@+id/task_container">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginRight="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:hint="@string/title_task"
        android:id="@+id/title_task"
        android:layout_gravity="left|center_vertical" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:hint="@string/task_vinculado"
        android:id="@+id/task_vinculado"
        android:layout_gravity="left|center_vertical"
        android:layout_marginTop="5dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="5dp"
        android:hint="@string/limit_date"
        android:id="@+id/limit_date"
        android:layout_gravity="left|center_vertical" />
</LinearLayout>

    <ImageButton
        android:id="@+id/delete_task_button"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_discard"
        android:background="?android:selectableItemBackground"
        android:contentDescription="@string/action_remove_item" />

</LinearLayout>

好吧,按照我想要的方式看:

Layout Preview 1(我在 Java 代码上设置的颜色)

所以,我决定做一个“布局动画更改” (喜欢它--> developer.android.com/training/animation/layout.html)

然后,我将 layout/fragment_list.xml (就像 Android 开发者网站显示的应用程序)替换为

布局/test.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:showDividers="middle"
        android:divider="?android:dividerHorizontal"
        android:animateLayoutChanges="true"
        android:paddingLeft="5dp"
        android:paddingRight="5dp" />

</ScrollView>

<TextView
    android:id="@android:id/empty"
    style="?android:textAppearanceSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="@string/no_task"
    android:padding="32dp"
    android:textColor="?android:textColorSecondary" />

</FrameLayout>

而且这个新布局改变了我的布局项配置,我不能再配置了。看:

Layout Preview 2

我想用我的旧风格制作一个“布局更改动画”。有人能帮我吗? 非常感谢关注!!! 谢谢!

【问题讨论】:

    标签: android xml android-layout animation layout


    【解决方案1】:

    我设法解决了这个问题。我正在使用以下代码操作布局:

    public class TaskFragment extends Fragment {
     private ViewGroup mContainerView;
     private View view;
    
    
     public TaskFragment() {
     }
    
     @Override
     public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
    
     view = inflater.inflate(R.layout.teste, container, false);
     assert view != null;
    
     mContainerView = (ViewGroup) view.findViewById(R.id.container);
    
     return view;
    }
    
    
    @Override
    public void onStart(){
      super.onStart();
    
      ContentResolver contentResolver = getActivity().getContentResolver();
      Uri uri = NectarContract.Task.CONTENT_URI;
      Cursor c = contentResolver.query(uri, NectarContract.Task.PROJECTION, null, null, null);
      assert c != null;
      while (c.moveToNext()) {
        Task task = new Task();
        task.setId(c.getInt(NectarContract.COLUMN_TASK_ID));
        task.setTitle(c.getString(NectarContract.COLUMN_TASK_TITLE));
        task.setVinculado(c.getString(NectarContract.COLUMN_TASK_VINCULADO));
        task.setEnd(c.getString(NectarContract.COLUMN_TASK_END));
        task.setPrioridade(c.getInt(NectarContract.COLUMN_TASK_PRIORIDADE));
    
        view.findViewById(android.R.id.empty).setVisibility(View.GONE);
        populate(task);
      }
    }
    
    private void populate(final Task task){
      final ViewGroup newView = (ViewGroup) LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.task, mContainerView, false);
    
      CheckBox checkbox = (CheckBox) newView.findViewById(R.id.task_checkbox);
      checkbox.setTag(task.getId());
      TextView title = (TextView) newView.findViewById(R.id.title_task);
      TextView vinculado = (TextView) newView.findViewById(R.id.task_vinculado);
      TextView end = (TextView) newView.findViewById(R.id.limit_date);
      LinearLayout container = (LinearLayout) newView.findViewById(R.id.task_container);
    
      title.setText(task.getTitle());
      if (task.getPrioridade() == 0) {
          title.setTextColor(Color.BLUE);
      }
      if (task.getPrioridade() == 1) {
          title.setTextColor(0xFFE29400);
      }
      if (task.getPrioridade() == 2) {
          title.setTextColor(Color.RED);
      }
      vinculado.setText("Vinculado a: " + task.getVinculado());
      end.setText("Data prevista: " + task.getEndString());
    
      container.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent = new Intent(getActivity().getApplicationContext(), TaskActivity.class);
              intent.putExtra(ARG_TASK, task);
              intent.putExtra(TaskActivity.USER, user);
              intent.putExtra(TaskActivity.METHOD, TaskActivity.UPDATE);
              startActivityForResult(intent, 1);
          }
      });
      newView.findViewById(R.id.delete_task_button).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            mContainerView.removeView(newView);
            if (mContainerView.getChildCount() == 0) {
                view.findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
            }
          }
       });
       mContainerView.addView(newView, 0);
     }
    

    }

    那么,从过去的上下文中丢失了信息

    为了解决它,我必须换行:

    final ViewGroup newView = (ViewGroup) LayoutInflater.from(getActivity().getApplicationContext()).inflate(R.layout.task, mContainerView, false);
    

    并将 ir 替换为:

    final ViewGroup newView = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.task, mContainerView, false);
    

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多