2014-02-07 3 views
0

позвольте мне сказать, что я новичок в разработке Android. У меня есть класс MainActivity, xml-макет для него и пользовательский класс представления, используемый для рисования. Моя проблема в том, что мне нужно передать экземпляр класса MainActivity в пользовательский класс представления. Я попытался с Bundle и узнал, что он не может передавать экземпляры. Я могу получить доступ к отдельной переменной (_grid в этом случае) и работать с ней в классе вида, сделав ее статической, но в этом случае это не вариант. Я читал и пытался с getContext(), но без результата. Я узнал, что я также не могу переопределить конструкторы пользовательских представлений. Итак, что мне нужно сделать, чтобы передать экземпляр MainActivity в пользовательский класс представления?Как передать экземпляр действия пользовательскому представлению?

MainActivity класс:

package com.example.myfirstapp; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.view.Menu; 
    import android.view.View; 
    import android.widget.Button; 

    public class MainActivity extends Activity 
    { 
     boolean isPlaying = false; 
     static int[][] _grid = new int[10][13]; 


     //Fill grid with zeros (just in case) 
     public void initialiseGrid() 
     { 
      for(int i = 0; i < 10; i++) 
      { 
       for(int j = 0; j < 13; j++) 
       { 
        _grid[i][j] = 0; 
       } 
      } 
     } 

     //Note addition 
     public void addToGrid(int x, int y) 
     { 
      _grid[x][y] = 1;  
     } 

     //Note removal 
     public void removeFromGrid(int x, int y) 
     { 
      _grid[x][y] = 0; 
     } 

      @Override 
      protected void onCreate(Bundle savedInstanceState) 
      { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        initialiseGrid(); 
      } 

      //Play button functionality 
     public void playButton (View v) 
     {   
      //button logic 
     } 

     //Stop button functionality 
     public void stopButton (View v) 
     { 
      //button logic 

     }  
    }  

Это расположение XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:paddingLeft="16dp" 
android:paddingRight="16dp" > 

<com.example.myfirstapp.showImage 
    android:id="@+id/my_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<Button 
    ... /> 

<Button 
    ... /> 

</RelativeLayout> 

И пользовательский класс вид:

package com.example.myfirstapp; 

//imports 

class showImage extends View 
{  
    Vector<Pair<Integer, Integer>> _notePositions = new Vector<Pair<Integer, Integer>>(); 
    Canvas _canvas; 
    Paint _paint = new Paint(); 
    MainActivity _main; 

    Bitmap _score; 
    Bitmap _note = BitmapFactory.decodeResource(getResources(), R.drawable.note); 
    Bitmap _tempNote = BitmapFactory.decodeResource(getResources(), R.drawable.note); 

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

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

    @Override 
    public void onDraw (Canvas canvas) 
    {  
     //irrelevant code 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     //irrelevant code 
    } 
} 
+0

in thecreate of mainactivity передать контекст строителю cusotmview – Raghunandan

+0

showImage (this); –

+0

это инверсия инверсии зависимостей и является двойной эффективностью – zapl

ответ

0
You can pass the context of your MainActivity class to your Custom view class. 

// In Main Activity 

    public class MainActivity extends Activity 
    { 
     onCreate(Bundle b) 
     { 

     // Create Instance of your view class & pass context of your MainActivity class 
      ShowImage showImage=new ShowImage(MainActivity.this); 


     } 

// In Custom View class 

    public class ShowImage extends View 
    { 
     Context context; 
    // Create constructor ShowImage(with argument Context) 

     public ShowImage(Context context) 
    { 
     this.context=context; 
    } 

    } 
+0

Это не позволяет мне использовать методы MainActivity, которые я хочу использовать. Также конструкторы showImage должны иметь суперконтекстный вызов. –

0

Хорошо мне удалось сделать то, что я буду вызовите работу, так как я использую статическую функцию Тион.

В моем классе MainActivity у меня есть:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initialiseGrid(); 
    showImage.getIstance(this); //this is the new line 
} 

И в моем классе ShowImage у меня есть:

static MainActivity _main; 

. 
. 
. 
public static void getIstance(MainActivity mainActivity) 
{ 
    _main = mainActivity;  
} 

В моем случае я не буду иметь никаких других экземпляров, так что это работает отлично.

Смежные вопросы