无法添加自定义视图类

时间:2015-03-03 04:08:37

标签: java android view android-view

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

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

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

 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()使用的为视图充气的原始布局的一部分?

更新:

我试图将这个视图多次插入一个布局中,该布局被放置在父布局中,该布局为视图设置为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);

2 个答案:

答案 0 :(得分:0)

1.要保留单个视图的数据,您需要为其分配唯一的ID。 您可以在运行时生成唯一ID,请参阅此链接

Android: View.setID(int id) programmatically - how to avoid ID conflicts?保持唯一ID

2.对于你的第二个问题,我认为你需要创建该视图的另一个对象并将其添加到锻炼布局

答案 1 :(得分:0)

您在自定义类中夸大了布局文件。所以你已经在那个自定义类中添加了一个视图,并且在这里你做了同样的事情

workoutLayout.addView(workoutView);

出现问题。您需要更改以下内容。

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