1

これらのクラスで何をするかわからない場合は、こちらをご覧くださいまた、これが機能するかどうかはまだ 100% 確信が持てません。テスト中です。


私は現在、クラスのカスタムxml属性の使用を簡素化する簡素化された基本クラスの作成に取り組んでいAttributeSetます

基本的に、これは私が最終結果として探しているものです...

public class SimpleViewImplementation extends SimpleView<LinearLayout> {

    // List of members here
    private String value;

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

    @Override
    protected void setFromStyledAttributes(TypedArray attr) {

        // Set conditions for each member here via TypedArray (use setters)
        setValue(attr.getString(R.styleable.SimpleViewImplementation_value));

    }

    @Override
    protected void initView() {

        // Set initial conditions for each member here
        this.value = "this is the default value!";

    }

    // Getters & Setters here for members
    public String getValue() { return this.value; }
    public void setValue(String value) { 

        this.value = value;
        this.updateViewOnSet();
    }

}

これはすべての魔法を行う「基本」クラスです。問題は実際にはクラスの「署名」です。type を拡張するために必要Tです。オンラインでの調査でそれを行う方法を見逃したか、それを行うことができません。それができない場合、上記の私の結果をいくらか得るための提案はありますか. これらのクラスで何をするかわからない場合は、こちらをご覧ください

public abstract class SimpleView<T> {   // I would like this class to extend Type T. ie SimpleView<LinearLayout> would extend this class to be a LinearLayout...getting rid of compile-time errors below
    //                             ^ can I put anything here????

    public SimpleView(Context context) {

        super(context); // CTE (Compile-time error)
        initView();

    }

    public SimpleView(Context context, AttributeSet attrs) {

        super(context, attrs);  // CTE
        initView();

        TypedArray attr = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DrawerSongDetail, 0, 0);

        try {

            this.setFromStyledAttributes(attr);

        } finally { 

            attr.recycle(); 

        }

    }

    // Sets all members based on AttributeSet parameter
    abstract protected void setFromStyledAttributes(TypedArray attr);

    // Sets all initial values of members
    abstract protected void initView();

    private void updateViewOnSet() {

        this.requestLayout();   // CTE
        this.invalidate();  // CTE

    }
}
4

1 に答える 1

0

これを行う方法の例を次に示します: http://www.lukehorvat.com/blog/android-seekbardialogpreference/

編集:

このような設定では行方不明になるでしょうか?

public abstract class SimpleView  {  

private View view;

public SimpleView(Context context, View view) {

    if (view == null || !(view instanceof View)) {
        throw new RuntimeException("SimpleView expects an instance of View");
    }

    this.view = view;

    initView();

}

public SimpleView(Context context, View view, AttributeSet attrs) {

    if (view == null || !(view instanceof View)) {
        throw new RuntimeException("SimpleView expects an instance of View");
    }

    this.view = view;

    initView();

    TypedArray attr = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DrawerSongDetail, 0, 0);

    try {

        this.setFromStyledAttributes(attr);

    } finally { 

        attr.recycle(); 

    }

}

// Sets all members based on AttributeSet parameter
abstract protected void setFromStyledAttributes(TypedArray attr);

// Sets all initial values of members
abstract protected void initView();

protected void updateViewOnSet() {

    view.requestLayout();  
    view.invalidate(); 

}
}

これを次のように使用できると思います。

public class SimpleViewImplementation extends SimpleView {

// List of members here
private String value;

public SimpleViewImplementation(Context context) {
    super(context, new RelativeLayout(context));
    // Define your View here (demonstrated with RelativeLayout)
}

public SimpleViewImplementation(Context context, View view) {
    // Predefined view
    super(context, view);
}

public SimpleViewImplementation(Context context, AttributeSet attrs) {
    super(context, new LinearLayout(context), attrs);
    // Define your View here (demonstrated with LinearLayout)
}

public SimpleViewImplementation(Context context, View view, AttributeSet attrs) {
    super(context, view, attrs);
    // Predefined view
}

@Override
protected void setFromStyledAttributes(TypedArray attr) {

    // Set conditions for each member here via TypedArray (use setters)
    setValue(attr.getString(R.styleable.SimpleViewImplementation_value));

}

@Override
protected void initView() {

    // Set initial conditions for each member here
    this.value = "this is the default value!";

}

// Getters & Setters here for members
public String getValue() { return this.value; }
public void setValue(String value) { 

    this.value = value;
    this.updateViewOnSet();
}

}
于 2013-09-27T01:08:22.627 に答える