5

Tôi có một lớp mở rộng view, xác định bản vẽ tùy chỉnh (điện trở). Tôi muốn nhấp vào nút và thêm view vào số main layout. để tôi nhìn thấy điện trở, và nếu tôi bấm một lần nữa nó sẽ thêm một điện trở và như vậy. nhưng tôi không biết cách tốt nhất để tiếp cận vấn đề này. Tôi đã xem xét rất nhiều câu hỏi đề cập đến layoutinflater, nhưng không có câu hỏi nào trong số đó làm tăng lớp xem tùy chỉnh (có thể tôi đang tìm kiếm điều sai), luôn là tệp xml. Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể thêm nhiều ResistorViews vào bố cục của tôi để người dùng có thể giao diện (di chuyển, xóa, đánh dấu, v.v.) với họ?Làm cách nào để tăng cấp độ xem tùy chỉnh?

Đây là những gì tôi đã cố gắng:

Hoạt động Class:

public class CircuitSolverActivity extends Activity {  

@Override  
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final Button bAddResistor = (Button) findViewById(R.id.bAdd);   
    final LinearLayout mLayout = (LinearLayout)findViewById(R.layout.main); 
    final ResistorView mResistor = new ResistorView(this, 100, 100); 
    bAddResistor.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) {    

      mLayout.addView(mResistor);     

     } 
    }); 
    }  

} 

ResistorView lớp:

public class ResistorView extends View{ 

    private Path mSymbol; 
    private Paint mPaint; 

    int mX, mY; 

    //...Override Constructors...  
    public ResistorView(Context context, AttributeSet attrs) { 
     super(context, attrs);   
     init(); 
    } 

    public ResistorView(Context context, int x, int y){ 
     super(context);  
     mX = x; 
     mY = y; 
     init(); 
    } 

    private void init() { 

     mSymbol = new Path(); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true);  
     mPaint.setStrokeWidth(2); 
     mPaint.setColor(-7829368); 

     mPaint.setStyle(Paint.Style.STROKE);  

     mSymbol.moveTo(0.0F, 0.0F); 
     mSymbol.lineTo(0.0F, 50.0F); 
     mSymbol.lineTo(16.666666F, 58.333332F); 
     mSymbol.lineTo(-16.666666F, 75.0F); 
     mSymbol.lineTo(16.666666F, 91.666664F); 
     mSymbol.lineTo(-16.666666F, 108.33333F); 
     mSymbol.lineTo(16.666666F, 124.99999F); 
     mSymbol.lineTo(-16.666666F, 141.66666F); 
     mSymbol.lineTo(0.0F, 150.0F); 
     mSymbol.lineTo(0.0F, 200.0F); 
     mSymbol.offset(mX, mY); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

    super.onDraw(canvas); 
    canvas.drawPath(mSymbol, mPaint);  
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"   
    android:orientation="vertical" 
    android:id="@+id/main"> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/bAdd" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add RES" /> 


</LinearLayout> 

Thần ks.

EDIT: SOLVED * Cảm ơn một lần nữa cho sự giúp đỡ. *

Trả lời

4

Thổi phồng (theo quan điểm của Android) là hoàn toàn cho XML. Nếu bạn đang tạo động và thêm một đối tượng dạng xem trong mã, thì điều đó không làm tăng thêm. Những gì bạn đang làm trong mã của bạn ngay bây giờ là khá gần. Vấn đề duy nhất là bạn khởi tạo chế độ xem một lần, trong khi có vẻ như bạn muốn thêm một lượt xem mới mỗi khi bạn nhấp vào. Hãy thử di chuyển instantiation vào xử lý nhấp chuột:

public class CircuitSolverActivity extends Activity {  

@Override  
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final Button bAddResistor = (Button) findViewById(R.id.bAdd);   
    final LinearLayout mLayout = (LinearLayout)findViewById(R.id.main); 
    bAddResistor.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) {    
      final ResistorView mResistor = new ResistorView(CircuitSolverActivity.this, 100, 100); 
      mLayout.addView(mResistor);     
     } 
    }); 
    }  
} 
+0

Cảm ơn cho câu trả lời đó, tôi đã cố gắng những gì bạn đề nghị, nhưng khi tôi đặt nhanh chóng dòng, tôi không thể sử dụng từ khóa "này" để có được những bối cảnh. Vì vậy, thay vì "này" những gì khác tôi có thể làm gì để có được bối cảnh? – 0gravity

+0

sử dụng getBaseContext() –

+0

Ok, vì vậy tôi đã sử dụng getBaseContext() và mã mà Kabuko đề xuất nhưng tôi gặp lỗi java.lang.NullPointerException trên LogCat. Điều này xảy ra khi tôi nhấp vào nút. – 0gravity

2

Lưu bối cảnh như là một biến Ví dụ như tin private Context context; và Init bối cảnh như context=this; trong constructor của hoạt động này. Thêm chế độ xem tùy chỉnh bằng ngữ cảnh Biến trong phương thức gọi lại onclick

bAddResistor.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) {    
    final ResistorView resistor = new ResistorView(context, 100, 100); 
    mLayout.addView(resistor); 
    } 
}); 
+0

Cảm ơn câu trả lời của bạn, nhưng tôi vẫn nhận được lỗi tương tự như tôi đã đăng ở trên. Tôi không biết chuyện gì đang diễn ra. – 0gravity

+0

Dòng nào chính xác là bạn nhận được NullPointerException? – Gautam

+0

'mLayout.addView (điện trở)' – 0gravity

0

Bạn có thể tham khảo "this" của lớp bên ngoài bằng cách thêm tên của nó. Giả sử bạn có lớp A bên trong mà bạn định nghĩa một lớp B. Bên trong B, "this" dùng để chỉ B, nhưng bạn cũng có thể gõ "A.this" và lấy A's this.

Hy vọng điều này sẽ hữu ích.

Shachar

+0

Cảm ơn câu trả lời nhưng tôi vẫn gặp lỗi tương tự. – 0gravity

Các vấn đề liên quan