如何显示此自定义视图?
How can I get this custom view to show?
我在显示此视图时遇到问题。当我转到应该有视图的屏幕时,视图中没有任何反应这里是相关文件:
CreateTimerActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_timer);
final Context context = this;
mVisible = true;
mControlsView = findViewById(R.id.create_timer_content_controls);
mContentView = findViewById(R.id.create_timer_content);
// Set up the user interaction to manually show or hide the system UI.
mContentView.setOnClickListener((View view) -> {
toggle();
});
/*XmlPullParser parser = getResources().getXml(R.id.view_tim);
AttributeSet attributes = Xml.asAttributeSet(parser);*/
final TableLayout tableLayout = (TableLayout) findViewById(R.id.create_timer_table);
TimerFormView timerFormView = new TimerFormView(context, tableLayout);
timerFormView.initializeComponents();
}
TimerFormView.java
public class TimerFormView extends TableLayout {
private Context context;
private final ContentValues timerValues;
private final ContentValues timerSegmentValues;
private final TableLayout tableLayout;
public TimerFormView(Context context, TableLayout tableLayout) {
this(context, null, tableLayout);
}
public TimerFormView(Context context, AttributeSet attrs, TableLayout tableLayout) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TimerFormView, 0, 0);
String titleText = "Hello";
@SuppressWarnings("ResourceAsColor")
int valueColor = a.getColor(0,
android.R.color.holo_blue_light);
a.recycle();
this.context = context;
this.tableLayout = tableLayout;
TimerDatabase timerDatabase = new TimerDatabase(context);
SQLiteDatabase databaseHelper = timerDatabase.getWritableDatabase();
timerValues = new ContentValues();
timerValues.put(TimerDatabase.TimerEntry.COLUMN_NAME_TIMER_NAME, "");
timerSegmentValues = new ContentValues();
}
public TimerFormView(Context context, AttributeSet attrs)
{
this(context, attrs, null);
}
public void initializeComponents() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_timer_form, this, true);
final TextView timerNameTextView = (TextView) findViewById(R.id.timerNameTxt);
timerNameTextView.setSingleLine(true);
InputFilter[] filterArrayTimerName = new InputFilter[1];
filterArrayTimerName[0] = new InputFilter.LengthFilter(32);
timerNameTextView.setFilters(filterArrayTimerName);
final Button saveTimerBtn = (Button) findViewById(R.id.saveTimerBtn);
saveTimerBtn.setEnabled(false);
saveTimerBtn.setOnClickListener((View v) -> {
timerValues.put(TimerDatabase.TimerEntry.COLUMN_NAME_TIMER_NAME, timerNameTextView.getText().toString());
});
// Enable the timer to be saved once text is entered
TextWatcher timerNameTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s){
if(s.length() > 0) {
saveTimerBtn.setEnabled(true);
} else {
saveTimerBtn.setEnabled(false);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// you can check for enter key here
}
public void onTextChanged (CharSequence s, int start, int before,int count) {
}
};
EditText timerNameEditText = (EditText) findViewById(R.id.timerNameTxt);
timerNameEditText.addTextChangedListener(timerNameTextWatcher);
// Segments
final TextView segmentNameTextView = (TextView) findViewById(R.id.segmentNameTxt);
segmentNameTextView.setSingleLine(true);
InputFilter[] filterArraySegmentName = new InputFilter[1];
filterArraySegmentName[0] = new InputFilter.LengthFilter(32);
segmentNameTextView.setFilters(filterArraySegmentName);
Button addSegmentBtn = (Button) findViewById(R.id.addSegmentBtn);
addSegmentBtn.setEnabled(false);
addSegmentBtn.setOnClickListener((View v) -> {
// Content for the new segment
TableRow segmentTableRow = new TableRow(context);
segmentNameTextView.setText(segmentNameTextView.getText());
segmentTableRow.addView(segmentNameTextView);
tableLayout.addView(segmentTableRow);
timerSegmentValues.put(TimerDatabase.TimerSegment.COLUMN_NAME_SEGMENT_NAME, segmentNameTextView.getText().toString());
});
TextWatcher segmentNameTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s){
if(s.length() > 0) {
saveTimerBtn.setEnabled(true);
} else {
saveTimerBtn.setEnabled(false);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// you can check for enter key here
}
public void onTextChanged (CharSequence s, int start, int before,int count) {
}
};
EditText segmentNameEditText = (EditText) findViewById(R.id.segmentNameTxt);
segmentNameEditText.addTextChangedListener(segmentNameTextWatcher);
EditText segmentDurationEditText = (EditText) findViewById(R.id.segmentDurationTxt);
//segmentDurationEditText.addTextChangedListener(segmentTextWatcher);
EditText segmentRepeatEditText = (EditText) findViewById(R.id.segmentRepeatTxt);
//segmentRepeatEditText.addTextChangedListener(segmentTextWatcher);
setVisibility(View.VISIBLE);
super.layout(50, 50, 50, 50);
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
}
}
view_timer_form.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="400dp" android:layout_height="400dp">
<TableRow android:layout_width="400dp" android:layout_height="400dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Create Timer"
android:id="@+id/createTimerLbl" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Timer Name"
android:id="@+id/timerNameLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timerNameTxt"
android:layout_column="1" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/addSegmentNameRow">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Segment Name"
android:id="@+id/segmentNameLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentNameTxt"
android:layout_column="1" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Duration"
android:id="@+id/segmentDurationLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentDurationTxt"
android:inputType="number"
android:layout_column="1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Seconds"
android:id="@+id/durationSecondsLbl"
android:gravity="top" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Repeat"
android:id="@+id/segmentRepeatLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentRepeatTxt"
android:inputType="number"
android:layout_column="1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Times"
android:id="@+id/segmentRepeatTimesLbl"
android:gravity="top" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/addSegmentBtnRow">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Segment"
android:id="@+id/addSegmentBtn" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save Timer"
android:id="@+id/saveTimerBtn" />
</TableRow>
</TableLayout>
activity_create_timer.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0099cc"
tools:context="com.example.timer.CreateTimerActivity">
<TextView android:id="@+id/create_timer_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:keepScreenOn="true" android:textColor="#33b5e5"
android:textStyle="bold" android:textSize="50sp" android:gravity="center"
android:text="" />
<!-- This FrameLayout insets its children based on system windows using
android:fitsSystemWindows. -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:id="@+id/create_timer_content_controls"
style="?metaButtonBarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
tools:ignore="UselessParent">
<com.example.timer.views.TimerFormView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/create_timer_table">
</com.example.timer.views.TimerFormView>
</LinearLayout>
</FrameLayout>
</FrameLayout>
我遇到过这样的问题,我用这种方法解决了...
- 不要从 activity.
调用 customView 的任何实例甚至静态变量
- 仅使用(上下文,属性)定义构造函数
- 并在 customView 中初始化你想要的一切 class。
祝你好运
我在显示此视图时遇到问题。当我转到应该有视图的屏幕时,视图中没有任何反应这里是相关文件:
CreateTimerActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_timer);
final Context context = this;
mVisible = true;
mControlsView = findViewById(R.id.create_timer_content_controls);
mContentView = findViewById(R.id.create_timer_content);
// Set up the user interaction to manually show or hide the system UI.
mContentView.setOnClickListener((View view) -> {
toggle();
});
/*XmlPullParser parser = getResources().getXml(R.id.view_tim);
AttributeSet attributes = Xml.asAttributeSet(parser);*/
final TableLayout tableLayout = (TableLayout) findViewById(R.id.create_timer_table);
TimerFormView timerFormView = new TimerFormView(context, tableLayout);
timerFormView.initializeComponents();
}
TimerFormView.java
public class TimerFormView extends TableLayout {
private Context context;
private final ContentValues timerValues;
private final ContentValues timerSegmentValues;
private final TableLayout tableLayout;
public TimerFormView(Context context, TableLayout tableLayout) {
this(context, null, tableLayout);
}
public TimerFormView(Context context, AttributeSet attrs, TableLayout tableLayout) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TimerFormView, 0, 0);
String titleText = "Hello";
@SuppressWarnings("ResourceAsColor")
int valueColor = a.getColor(0,
android.R.color.holo_blue_light);
a.recycle();
this.context = context;
this.tableLayout = tableLayout;
TimerDatabase timerDatabase = new TimerDatabase(context);
SQLiteDatabase databaseHelper = timerDatabase.getWritableDatabase();
timerValues = new ContentValues();
timerValues.put(TimerDatabase.TimerEntry.COLUMN_NAME_TIMER_NAME, "");
timerSegmentValues = new ContentValues();
}
public TimerFormView(Context context, AttributeSet attrs)
{
this(context, attrs, null);
}
public void initializeComponents() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_timer_form, this, true);
final TextView timerNameTextView = (TextView) findViewById(R.id.timerNameTxt);
timerNameTextView.setSingleLine(true);
InputFilter[] filterArrayTimerName = new InputFilter[1];
filterArrayTimerName[0] = new InputFilter.LengthFilter(32);
timerNameTextView.setFilters(filterArrayTimerName);
final Button saveTimerBtn = (Button) findViewById(R.id.saveTimerBtn);
saveTimerBtn.setEnabled(false);
saveTimerBtn.setOnClickListener((View v) -> {
timerValues.put(TimerDatabase.TimerEntry.COLUMN_NAME_TIMER_NAME, timerNameTextView.getText().toString());
});
// Enable the timer to be saved once text is entered
TextWatcher timerNameTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s){
if(s.length() > 0) {
saveTimerBtn.setEnabled(true);
} else {
saveTimerBtn.setEnabled(false);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// you can check for enter key here
}
public void onTextChanged (CharSequence s, int start, int before,int count) {
}
};
EditText timerNameEditText = (EditText) findViewById(R.id.timerNameTxt);
timerNameEditText.addTextChangedListener(timerNameTextWatcher);
// Segments
final TextView segmentNameTextView = (TextView) findViewById(R.id.segmentNameTxt);
segmentNameTextView.setSingleLine(true);
InputFilter[] filterArraySegmentName = new InputFilter[1];
filterArraySegmentName[0] = new InputFilter.LengthFilter(32);
segmentNameTextView.setFilters(filterArraySegmentName);
Button addSegmentBtn = (Button) findViewById(R.id.addSegmentBtn);
addSegmentBtn.setEnabled(false);
addSegmentBtn.setOnClickListener((View v) -> {
// Content for the new segment
TableRow segmentTableRow = new TableRow(context);
segmentNameTextView.setText(segmentNameTextView.getText());
segmentTableRow.addView(segmentNameTextView);
tableLayout.addView(segmentTableRow);
timerSegmentValues.put(TimerDatabase.TimerSegment.COLUMN_NAME_SEGMENT_NAME, segmentNameTextView.getText().toString());
});
TextWatcher segmentNameTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s){
if(s.length() > 0) {
saveTimerBtn.setEnabled(true);
} else {
saveTimerBtn.setEnabled(false);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// you can check for enter key here
}
public void onTextChanged (CharSequence s, int start, int before,int count) {
}
};
EditText segmentNameEditText = (EditText) findViewById(R.id.segmentNameTxt);
segmentNameEditText.addTextChangedListener(segmentNameTextWatcher);
EditText segmentDurationEditText = (EditText) findViewById(R.id.segmentDurationTxt);
//segmentDurationEditText.addTextChangedListener(segmentTextWatcher);
EditText segmentRepeatEditText = (EditText) findViewById(R.id.segmentRepeatTxt);
//segmentRepeatEditText.addTextChangedListener(segmentTextWatcher);
setVisibility(View.VISIBLE);
super.layout(50, 50, 50, 50);
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
}
}
view_timer_form.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="400dp" android:layout_height="400dp">
<TableRow android:layout_width="400dp" android:layout_height="400dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Create Timer"
android:id="@+id/createTimerLbl" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Timer Name"
android:id="@+id/timerNameLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timerNameTxt"
android:layout_column="1" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/addSegmentNameRow">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Segment Name"
android:id="@+id/segmentNameLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentNameTxt"
android:layout_column="1" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Duration"
android:id="@+id/segmentDurationLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentDurationTxt"
android:inputType="number"
android:layout_column="1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Seconds"
android:id="@+id/durationSecondsLbl"
android:gravity="top" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Repeat"
android:id="@+id/segmentRepeatLbl"
android:gravity="top" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/segmentRepeatTxt"
android:inputType="number"
android:layout_column="1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Times"
android:id="@+id/segmentRepeatTimesLbl"
android:gravity="top" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/addSegmentBtnRow">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Segment"
android:id="@+id/addSegmentBtn" />
</TableRow>
<TableRow android:layout_width="match_parent" android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save Timer"
android:id="@+id/saveTimerBtn" />
</TableRow>
</TableLayout>
activity_create_timer.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0099cc"
tools:context="com.example.timer.CreateTimerActivity">
<TextView android:id="@+id/create_timer_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:keepScreenOn="true" android:textColor="#33b5e5"
android:textStyle="bold" android:textSize="50sp" android:gravity="center"
android:text="" />
<!-- This FrameLayout insets its children based on system windows using
android:fitsSystemWindows. -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:id="@+id/create_timer_content_controls"
style="?metaButtonBarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
tools:ignore="UselessParent">
<com.example.timer.views.TimerFormView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/create_timer_table">
</com.example.timer.views.TimerFormView>
</LinearLayout>
</FrameLayout>
</FrameLayout>
我遇到过这样的问题,我用这种方法解决了...
- 不要从 activity. 调用 customView 的任何实例甚至静态变量
- 仅使用(上下文,属性)定义构造函数
- 并在 customView 中初始化你想要的一切 class。
祝你好运