2015-03-03 124 views
0

我希望能够使用layout_name.addView(CUSTOM VIEW CLASS INSTANCE)将自定义视图类添加到特定布局,或将它们添加到列表视图。无法添加自定义视图类

我打算以编程方式添加许多这些视图,并希望能够获得每个视图单独编辑文本/ spinners等的值。

当我尝试添加此自定义视图时,不会出现任何内容,第二次添加视图时也会收到此错误。

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
      at android.view.ViewGroup.addViewInner(ViewGroup.java:3577) 
      at android.view.ViewGroup.addView(ViewGroup.java:3430) 
      at android.view.ViewGroup.addView(ViewGroup.java:3375) 
      at android.view.ViewGroup.addView(ViewGroup.java:3351) 
      at com.modup.fragment.CreateFragment.onClick(CreateFragment.java:192) 
      at android.view.View.performClick(View.java:4442) 
      at android.view.View$PerformClick.run(View.java:18473) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5105) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
      at dalvik.system.NativeStart.main(Native Method) 

我能做些什么来添加此WorkoutView了特定布局,到LinearLayout中,其是与()使用的setContentView原始布局充气的视图的一部分?

UPDATE:

我试图插入这种观点,根据需要多次成被容纳在其中膨胀的视图是的setContentView父布局的布局()。

R.id.create_fragment_layout(原中使用的setContentView())

R.id.workout_layout(在create_fragment_layout内)

我想自定义视图插入到这个布局,而这个自定义视图需要有自己的R.id.somename_layout,里面有很多元素。

WorkoutView(自定义类)

public class WorkoutView extends LinearLayout implements View.OnClickListener { 
    int res_id; 
    public Spinner spinnerDifficulty, spinnerTime, spinnerMuscleGroup, spinnerSets, spinnerReps; 
    public EditText etWorkoutName; 
    public Button btnRemoveWorkout; 

    String workoutName, muscleGroup, sets, reps; 
    LayoutInflater inflater; 

    public WorkoutView(Context context) { 
     super(context); 
    } 

    public WorkoutView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public WorkoutView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public void init() { 
     inflate(getContext(), R.layout.single_workout_layout, this); 

     spinnerDifficulty = (Spinner) findViewById(R.id.spinnerDifficulty); 
     spinnerReps = (Spinner) findViewById(R.id.spinnerReps); 
     spinnerSets = (Spinner) findViewById(R.id.spinnerSets); 
     spinnerMuscleGroup = (Spinner) findViewById(R.id.spinnerWorkoutGroup); 
     spinnerTime = (Spinner) findViewById(R.id.spinnerTime); 
     etWorkoutName = (EditText) findViewById(R.id.etWorkoutName); 
     btnRemoveWorkout = (Button) findViewById(R.id.btnRemoveWorkout); 
     btnRemoveWorkout.setOnClickListener(this); 
    } 

    public String getReps() { 
     reps = spinnerReps.getSelectedItem().toString(); 
     return reps; 
    } 

    public String getWorkoutName() { 
     workoutName = etWorkoutName.getText().toString().trim(); 
     return workoutName; 
    } 

    public String getMuscleGroup() { 
     muscleGroup = spinnerMuscleGroup.getSelectedItem().toString(); 
     return muscleGroup; 
    } 

    public String getSets() { 
     sets = spinnerSets.getSelectedItem().toString(); 
     return sets; 
    } 

    public SingleWorkout getAll() { 
     //to be designed 
     return null; 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.btnRemoveWorkout: 
       Log.e("DID THIS WORK?", "BUTTON PRESSED"); 
       break; 
     } 

    } 
} 

我是如何创建视图

workoutView = new WorkoutView(getActivity()); 

如何,我添加视图到的LinearLayout

workoutLayout.addView(workoutView); 
+0

java.lang。IllegalStateException:指定的子项已具有 父级。您必须先调用子对象的父对象的removeView()。 平均workoutView已被添加到另一个视图。 – cxphong 2015-03-03 04:28:13

回答

0

您在自定义班级中扩充布局文件。所以你已经添加了该定制类的视图,并再次在这里做同样的事情

workoutLayout.addView(workoutView); 

所以就会发生问题。您需要更改以下内容。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    workoutView = new WorkoutView(getActivity()); 
    setContentView(workoutView); 
+0

因此,没有办法拥有父级布局,并且将单独的视图插入到父级布局中?我想维护已创建的原始ContentView,但在该内容视图中,我正在寻找一个布局,可以多次将我的WorkoutView类插入到该布局中。 – 2015-03-03 18:02:55