с использованием некоторых изящных новых API-интерфейсов в iOS4 я пытаюсь захватить ввод с камеры и микрофона iPhone и сохранить его в файл. ниже приведен код, который я использую.
AVCaptureSession* captureSession = [[AVCaptureSession alloc] init];
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];
AVCaptureDeviceInput* videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:captDevice error:&error];
AVCaptureMovieFileOutput * videoOutput = [[AVCaptureMovieFileOutput alloc] init];
if (videoInput && videoOutput && audioInput)
{
[captureSession addInput:audioInput];
[captureSession addInput:videoInput];
[captureSession addOutput:videoOutput];
if([captDevice lockForConfiguration:&error])
{
if ([captDevice hasTorch])
captDevice.torchMode = AVCaptureTorchModeOn;
[captDevice unlockForConfiguration];
}
else
{
NSLog(@"Could not lock device for config error: %@", error);
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSURL* saveLocationURL = [[NSURL alloc] initFileURLWithPath:[NSString stringWithFormat:@"%@/movie.mov", documentsDirectory]];
[videoOutput startRecordingToOutputFileURL:saveLocationURL recordingDelegate:self];
[captureSession startRunning];
[saveLocationURL release];
}
else
{
NSLog(@"Video Error: %@", error);
}
когда didFinishRecordingToOutputFileAtURL возвращается, я получаю загадочный ответ об ошибке.
Error Domain=AVFoundationErrorDomain Code=-11803 "Cannot Record" UserInfo=0x152f70 {NSLocalizedRecoverySuggestion=Try recording again., AVErrorRecordingSuccessfullyFinishedKey=false, NSLocalizedDescription=Cannot Record}
код ошибки -11803 означает " и единственный ответ, который я могу найти, кажется: « не помещайте ListView в ScrollView ». Мне еще предстоит увидеть какое-либо реальное объяснение , почему, хотя . Кажется, единственная причина, по которой я могу найти это, заключается в том, что Google не считает, что вам следует этого делать. Ну, я делаю, так и сделал.
Итак, вопрос в том, как поместить ListView в ScrollView, не сворачивая его до минимальной высоты?
Использование ListView
для того, чтобы сделать его не прокручиваемым, чрезвычайно дорого и противоречит всей цели ListView
. Вы должны НЕ делать этого. Вместо этого используйте LinearLayout
.
Вот мое решение. Я новичок в платформе Android, и я уверен, что это немного взломано, особенно в части прямого вызова .measure и непосредственной установки свойства LayoutParams.height
, но это работает.
Все, что вам нужно сделать, это вызвать Utility.setListViewHeightBasedOnChildren (yourListView)
, и он будет изменен, чтобы точно соответствовать высоте его элементов.
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem instanceof ViewGroup) {
listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
Вы не должны помещать ListView в ScrollView, потому что ListView уже является ScrollView. Это все равно, что поместить ScrollView в ScrollView.
Чего вы пытаетесь достичь?