2015-09-22 2 views
0

Новое для Android и наличие некоторых проблем с передачей данных из вида деятельности в представление. У меня есть простой метод onCreate для Android для моей активности.Android: передать значение для просмотра после setContentView

public class MyActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent intent = getIntent(); 
     int num = intent.getIntExtra(MainActivity.EXTRA_NUM, 0); 
     setContentView(R.layout.play_game); //this is a MyView class inside of a LinearLayout 
     //where I want to pass the value of num to MyView 
     MyView myView = (MyView) findViewById(R.id.myview); 
     myView.setNum(num); 
    } 
} 


public class MyView extends View { 
    protected int num; 
    protected int[] array; 

    public MyView(Context context) { 
     super(context); 
     init(); 
    } 

    public MyView(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
     init(); 
    } 

    protected void init() { 
     setBackgroundResource(R.drawable.pic1); 
     array = new int[num]; 
    } 

    public void setNum(int num) { 
     this.num = num; 
    } 
} 

Однако я не могу понять, как передать значение классу MyView (он расширяет представление). Я просто хочу отправить целочисленное значение, которое класс представления получит до запуска конструктора.

+0

Где находится класс MyView? –

+0

только что отредактировал его в – thehandyman

+0

Если вы не хотите добавлять сеттер к своему представлению, вы можете получить это значение из намерения прямо из вашего представления. В вашем пользовательском представлении используйте контекст int num = ((Activity)) .getIntent(). GetIntExtra (MainActivity.EXTRA_NUM, 0); ' – ugo

ответ

2
  1. Добавьте метод setter к вашим MyView классу

    public void setNum(int num) 
    { 
        this.num=num; 
    } 
    
  2. В MyActivity найти ваши смотреть

    MyView myView=(MyView) findViewById(R.id.ID_OF_YOURS_VIEW_IN_ACTIVITYS_LAYOUT); 
    
  3. Установить значение твоих, чтобы ваш просмотр, передавая его setter методы

    myView.setNum(num); 
    
+0

, поэтому я обновил свой код выше (xml уже был там) до того, что я пробовал. Тем не менее, похоже, что представление пытается инициализировать, прежде чем я установлю номер. Поэтому он вызывает init без установленного значения num и не работает. Мысли? – thehandyman

+0

Вы можете установить значение по умолчанию в поле MyView.num. Это предотвратит дробление. Затем вы должны вызывать 'init()' после установки значения. Вы можете вызвать его внутри setNum(); – mohax

1

Получить вид идентификатора по findViewById() в oncreate() класса MyActivity

MyView mv=(MyView) findViewById(R.id.your-view-id); 

Затем установите значение с помощью метода getdata()

mv.getdata(value); 

где getdata() метод выглядит как

public void getdata(int value) 
{ 
    this.value=value; 
} 
+0

Но я бы хотел, чтобы View не знал об активности.Разве нет способа передать данные в представление так же, как как намерения используются для передачи данных из одной активности в другую? Я бы предпочел этот способ вместо того, чтобы View нуждался в общении с активностью. – thehandyman

+0

Вы никогда не создаете новую активность из представления. – sbaar

+0

Просто пропустил то, что MyView расширял класс просмотра и допустил ошибку. Однако теперь это исправлено. Спасибо @sbaar –

0

после setContentView

MyView mv = (MyView) findviewById(R.id.myView); 
mv.setData(int number); 

Вам нужно сделать УстановитьДанные общественности. Убедитесь, что вы установили идентификатор myview с помощью

android:id="@+id/myView" 

в xml.

+0

, поэтому я обновил свой код выше (xml уже был там) до того, что я пробовал. Тем не менее, похоже, что представление пытается инициализировать, прежде чем я установлю номер. Поэтому он вызывает init без установленного значения num и не работает. Мысли? – thehandyman

0

У вас есть несколько вариантов:

Удалить инициализацию массива из инициализации() или дать ему значение по умолчанию для избежания ошибки, как другие предложили. Это зависит от того, имеет ли массив со значением по умолчанию смысл или нет в вашем контексте. Наконец, введите номер с помощью сеттера.

Вы также можете определить статический метод для установки числа из активности перед вызовом конструктора вида (делать это до раздувания представления с помощью findViewById()). Но, как правило, это плохая практика, и ее следует использовать в конкретных случаях.

Реальный вопрос: может ли вызов init() иметь смысл в конструкторах, и массив должен быть установлен при построении вида? Не может ли он быть инициализирован позже?

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