Android addView

时间:2014-03-21 13:48:15

标签: android view

替换视图时遇到问题。

这是我的View容器:

Container View
  --> newMethod 0
      --> savedMethod 0
      --> savedMethod 1
          [...]
  --> newMethod 1
      --> savedMethod 0
      [...]

目前,我有两个newNethod视图和一些saveMethod视图。

我想更改已点击的savedMethod视图。这是代码

savedMethod.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
       mSelectedViewIndex = ((ViewGroup) v.getParent()).indexOfChild(v);
       mSelectedView = v;
       mSelectedViewClicked = (LinearLayout) inflater.inflate(R.layout.component_saved_method_container_01_selected,null);

       ((ViewGroup) v.getParent()).removeView(v);

       ((ViewGroup) v.getParent()).addView(mSelectedViewClicked, mSelectedViewIndex);
       // ((ViewGroup) saveMethod.getParent()).addView(mSelectedViewClicked, mSelectedViewIndex);
  [...]

我检测到,我的addView行产生了Nullpointer异常:

03-21 14:36:33.608: E/AndroidRuntime(13192): java.lang.NullPointerException
03-21 14:36:33.608: E/AndroidRuntime(13192):    at com.xxxx.xxxx.view.NativeProfileFragment$4.onClick(NativeProfileFragment.java:326)
03-21 14:36:33.608: E/AndroidRuntime(13192):    at android.view.View.performClick(View.java:4633)
03-21 14:36:33.608: E/AndroidRuntime(13192):    at android.view.View$PerformClick.run(View.java:19330)
[...]

如果我将此行更改为以下内容:

((ViewGroup) saveMethod.getParent()).addView(mSelectedViewClicked, mSelectedViewIndex);

然后更改有效。但仅限于最后添加的newMethod(1)saveMethods。如果我现在从newMethod(0)单击一个saveMethod,那么我的代码将获得正确的索引,从索引上的newMethod(1)替换savedMethod。这似乎是逻辑上的,因为我使用saveMethod.getParent()。但是我怎么能用所有newMethods来解决这个问题呢?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。

我将ViewParent v.parent()保存在变量中并使用它。

以下是最终代码:

savedMethod.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
       mSelectedViewIndex = ((ViewGroup) v.getParent()).indexOfChild(v);
       mSelectedView = v;
       mSelectedViewParent = v.getParent();
       mSelectedViewClicked = (LinearLayout) inflater.inflate(R.layout.component_saved_method_container_01_selected,null);

       ((ViewGroup) mSelectedViewParent).removeView(v);
       ((ViewGroup) mSelectedViewParent).addView(mSelectedViewClicked, mSelectedViewIndex);
       // ((ViewGroup) saveMethod.getParent()).addView(mSelectedViewClicked, mSelectedViewIndex);
  [...]

现在它有效。但我无法理解为什么没有将ViewParent存储在变量中就无法工作。