Учебное пособие по планированию Runtime для Android

Кто-нибудь знает, как выполнить или иметь хорошую ссылку для создания макета активности во время выполнения в android?

Вот код моей деятельности. Я уверен, что я просто пренебрегаю чем-то здесь:

package com.isi.sa; import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class SimpleAssessmentTest extends Activity { LinearLayout layout; TextView question; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); layout = new LinearLayout(this); question = new TextView(this); layout.setLayoutParams(new ViewGroup.LayoutParams(-1,-1)); layout.setBackgroundColor(R.color.blue); question.setLayoutParams(new ViewGroup.LayoutParams(-1,-2)); question.setTextColor(R.color.green); question.setTextSize(1,14); question.setText("This is question1"); layout.addView(question); setContentView(layout); } } 

Как вы можете видеть, я просто пытаюсь добавить линейный макет с единственным текстовым представлением (только для целей тестирования), однако, когда начинается действие, я просто получаю черный экран с заголовком имени моего приложения.

благодаря

Solutions Collecting From Web of "Учебное пособие по планированию Runtime для Android"

Вы забыли установить свой контент. Вы должны добавить

 setContentView(layout); 

В конце метода onCreate

Вы можете проверить этот URL: http://www.linux-mag.com/cache/7705/1.html . Он имеет как виджеты библиотеки, так и пользовательские виджеты.

РЕДАКТИРОВАТЬ:

SetBackgroundColor требует ввода в формате ARGB: 0xAARRGGBB . Каждый AA, RR, GG и BB варьируются от 00 (минимум) до ff (максимум).

Здесь приводится минимальный пример, и он работает безупречно. Вот скриншот и код (немного измененный):

http://picturepush.com/public/3313522 (старый)

 package us.simpleit; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class SimpleGUI extends Activity { TextView tv; EditText et; LinearLayout ll; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //LinearLayout ll = new LinearLayout(this); ll = new LinearLayout(this); ll.setOrientation(android.widget.LinearLayout.VERTICAL); ll.setLayoutParams(new ViewGroup.LayoutParams(-1,-1)); // ARGB: Opaque Red ll.setBackgroundColor(0x88ff0000); tv = new TextView(this); tv.setLayoutParams(new ViewGroup.LayoutParams(-1,-2)); tv.setText("sample text goes here"); // ARGB: Opaque Green tv.setBackgroundColor(0x5500ff00); ll.addView(tv); et = new EditText(this); et.setLayoutParams(new ViewGroup.LayoutParams(-1,-2)); et.setText("edit me please"); // ARGB: Solid Blue et.setBackgroundColor(0xff0000ff); ll.addView(et); Button btn = new Button(this); btn.setText("Go!"); btn.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { tv.setText(et.getText().toString()); } }); ll.addView(btn); setContentView(ll); //setContentView(R.layout.main); } } 

Ниже показано, как создавать представления и макеты программно, не используя XML-файлы макета. Он также создает объект с закругленным прямоугольником, который рисует округленный прямоугольник вокруг любых дочерних объектов, которые помещаются в него.

 package android.example; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.TextView; public class MessageScreen extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int mainBackgroundColor = Color.parseColor("#2E8B57"); int labelTextColor = Color.parseColor("#FF4500"); int messageBackgroundColor = Color.parseColor("#3300FF"); int messageTextColor = Color.parseColor("#FFFF00"); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); float density = metrics.density; int minMarginSize = Math.round(density * 8); int paddingSize = minMarginSize * 2; int maxMarginSize = minMarginSize * 4; TextView label = new TextView(this); /* * The LayoutParams are instructions to the Layout that will contain the * View for laying out the View, so you need to use the LayoutParams of * the Layout that will contain the View. */ LinearLayout.LayoutParams labelLayoutParams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); label.setLayoutParams(labelLayoutParams); label.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); label.setPadding(paddingSize, paddingSize, paddingSize, paddingSize); label.setText(R.string.title); label.setTextColor(labelTextColor); TextView message = new TextView(this); RoundedRectangle.LayoutParams messageLayoutParams = new RoundedRectangle.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); /* * This is one of the calls must made to force a ViewGroup to call its * draw method instead of just calling the draw method of its children. * This tells the RoundedRectangle to put some extra space around the * View. */ messageLayoutParams.setMargins(minMarginSize, paddingSize, minMarginSize, maxMarginSize); message.setLayoutParams(messageLayoutParams); message.setTextSize(TypedValue.COMPLEX_UNIT_SP, paddingSize); message.setText(R.string.message); message.setTextColor(messageTextColor); message.setBackgroundColor(messageBackgroundColor); RoundedRectangle messageContainer = new RoundedRectangle(this); LinearLayout.LayoutParams messageContainerLayoutParams = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); messageContainerLayoutParams.setMargins(paddingSize, 0, paddingSize, 0); messageContainer.setLayoutParams(messageContainerLayoutParams); messageContainer.setOrientation(LinearLayout.VERTICAL); /* * This is one of the calls must made to force a ViewGroup to call its * draw method instead of just calling the draw method of its children. * This tells the RoundedRectangle to color the the exta space that was * put around the View as well as the View. This is exterior color of * the RoundedRectangle. */ messageContainer.setBackgroundColor(mainBackgroundColor); /* * This is one of the calls must made to force a ViewGroup to call its * draw method instead of just calling the draw method of its children. * This is the interior color of the RoundedRectangle. It must be * different than the exterior color of the RoundedRectangle or the * RoundedRectangle will not call its draw method. */ messageContainer.setInteriorColor(messageBackgroundColor); // Add the message to the RoundedRectangle. messageContainer.addView(message); // LinearLayout main = new LinearLayout(this); LinearLayout.LayoutParams mainLayoutParams = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); main.setLayoutParams(mainLayoutParams); main.setOrientation(LinearLayout.VERTICAL); main.setBackgroundColor(mainBackgroundColor); main.addView(label); main.addView(messageContainer); setContentView(main); } } 

Класс для объекта макета RoundedRectangle имеет следующие значения:

 /** * A LinearLayout that draws a rounded rectangle around the child View that was added to it. */ package android.example; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.LinearLayout; /** * A LinearLayout that has rounded corners instead of square corners. * * @author Danny Remington * * @see LinearLayout * */ public class RoundedRectangle extends LinearLayout { private int mInteriorColor; public RoundedRectangle(Context p_context) { super(p_context); } public RoundedRectangle(Context p_context, AttributeSet attributeSet) { super(p_context, attributeSet); } // Listener for the onDraw event that occurs when the Layout is drawn. protected void onDraw(Canvas canvas) { Rect rect = new Rect(0, 0, getWidth(), getHeight()); RectF rectF = new RectF(rect); DisplayMetrics metrics = new DisplayMetrics(); Activity activity = (Activity) getContext(); activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); float density = metrics.density; int arcSize = Math.round(density * 10); Paint paint = new Paint(); paint.setColor(mInteriorColor); canvas.drawRoundRect(rectF, arcSize, arcSize, paint); } /** * Set the background color to use inside the RoundedRectangle. * * @param Primitive int - The color inside the rounded rectangle. */ public void setInteriorColor(int interiorColor) { mInteriorColor = interiorColor; } /** * Get the background color used inside the RoundedRectangle. * * @return Primitive int - The color inside the rounded rectangle. */ public int getInteriorColor() { return mInteriorColor; } } 

Я не уверен, ответили на этот вопрос или нет, но я только что преодолел эту проблему сегодня. Вьет затронул проблему выше, но явно не указал, чтобы проверить ваши значения цвета. Если вы исходите из фона J2ME, как и я, вы можете определить свои значения цвета int как 0xRRGGBB, поэтому для полного красного J2ME он определит его как 0xFF0000. Однако, делая это на Android, вы получите значение int 0x00FF0000. Поскольку Android использует формат 0xAARRGGBB, значение 0xFF0000 (J2ME) на самом деле (0x00FF0000) в Android, это полный красный цвет, который полностью ПРОЗРАЧНО, поэтому его не видно на экране.

Я заметил выше в вашем коде, вы используете question.setTextColor(R.color.green); Этот оператор присваивает значение id, созданному в R-файле, поэтому, вероятно, это большое число с некоторым значением как 0x7f050000, где Alpha устанавливается ниже FULL OPAQUE. Попробуйте свой пример:

 question.setTextColor( getResources().getColor( R.color.green ) ); 

Это должно установить цвет текста в значение R.color.green, а не идентификатор R.color.green.