我通过常规方式开始活动:
Intent startIntent = new Intent(this, DualPaneActivity.class);
startIntent.putExtras(((SearchPageFragment) currentFragment).getPageState());
startActivity(startIntent);
Run Code Online (Sandbox Code Playgroud)
加载此活动时,它会将Fragment放在框架中,如下所示:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFragment = fragment;
currentFragment.setArguments(getIntent().getExtras());
transaction.replace(R.id.singlePane, currentFragment);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
看似简单吧?
但是,您可以在onCreateView()方法内部访问三个单独的包(如果包含Fragment中包含的包,则为四个onCreate(Bundle savedInstanceState)
):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Fill state information
Bundle bundle;
if(savedInstanceState != null) bundle = savedInstanceState; // 1
else if(getArguments() != null) bundle = getArguments(); // 2
else bundle = getActivity().getIntent().getExtras(); // 3
setPageState(bundle);
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我从试验中得出结论,我想要的包是第二个,从中检索到的包getArguments()
.
根据我的理解,第三个getActivity().getIntent().getExtras();
实际上是从用于开始包含活动的意图中调用Bundle.我也从实验中知道savedInstanceState
似乎总是空的.但它来自哪里,为什么它是空的?
该 …
我一直在试图跨越到移动我的代码DrawerLayout
作为由Android建议这里是SlidingDrawer
已经过时了.
我的问题是,到目前为止DrawerLayout
似乎要么执行得非常糟糕,有无用的错误消息(没有防御性编程)和/或在文档中没有得到足够的解释.
这个isDrawerOpen()
方法在这里描述:
public boolean isDrawerOpen(查看抽屉)
检查给定的抽屉视图当前是否处于打开状态.为了被视为"开放",抽屉必须已经稳定在其完全可见的状态.要检查部分可见性,请使用isDrawerVisible(android.view.View).
参数:drawer - 要检查的抽屉视图
返回:如果给定的抽屉视图处于打开状态,则返回true
每个方法isDrawerOpen(View drawer)
,openDrawer(View drawer)
并且closeDrawer(View drawer)
在传递时不起作用:DrawerLayout
有问题或者其中任何一个的孩子.我不知道我应该为这些方法提供什么来让它们发挥作用.有人能告诉我吗?
有关实现,请参阅下面的整个问题描述.
我有这样的布局:
<android.support.v4.widget.DrawerLayout
android:id="@+id/mainmenuPanel"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/dualPane"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/menuPane"
android:layout_width="300dp"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我将以下方法连接到一个按钮:
protected void onCreate(Bundle savedInstanceState) {
...
mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
....
}
public boolean isDrawerOpen() {
if(mMenuPanel != null) {
return mMenuPanel.isDrawerOpen(mMenuPanel);
}
return false;
} …
Run Code Online (Sandbox Code Playgroud) 我有一组FrameLayout
我想要检查/选择,
也就是说,点击后我希望FrameLayout
显示为checked
- 当再次按下时,我希望它成为联合国checked
.更重要的是,我希望通过使用a来像往常一样描述这个视觉阙<selector>
.
我似乎无法让这个工作 - 我不确定我缺少什么:
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private boolean mChecked = false;
public CheckableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setChecked(boolean checked) {
mChecked = checked;
refreshDrawableState();
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
Run Code Online (Sandbox Code Playgroud)
布局CheckableFrameLayout
:
<com.test.view.CheckableFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selector_horizontal"
android:clickable="true" >
Run Code Online (Sandbox Code Playgroud)
支持它的选择器(selector_horizontal.xml):
<item android:drawable="@drawable/selector_vertical_selected" android:state_pressed="false" android:state_checked="true"/>
<item android:drawable="@drawable/selector_vertical_pressed" android:state_pressed="true" …
Run Code Online (Sandbox Code Playgroud) 考虑来自developers.android.com的示例应用程序
这描述了像这样使用Fragments:
大!...但是......在第一个例子(带有电话的例子)中,您创建了一个活动,其中包含一个单独的xml文件,<fragment>
而这只是setContentView()
在您只在该xml上调用的活动中?这似乎是一个大量的冗余代码(活动,XML和片段显示片段):你可以设置一个Fragment
作为Activity
或不符合XML格式的包装总是需要?
在从同事添加一组代码后,我得到了这个输出:
./obj/local/armeabi/objs/jniWrapper/native.o: In function `_Vector_base':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h:73: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt6vectorIhSaIhEEC1ERKS1_[std::vector<unsigned char, std::allocator<unsigned char> >::vector(std::vector<unsigned char, std::allocator<unsigned char> > const&)]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `std::__node_alloc::deallocate(void*, unsigned int)':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h:161: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt4priv12_String_baseIcSaIcEED2Ev[std::priv::_String_base<char, std::allocator<char> >::~_String_base()]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `basic_string':
D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_string.c:643: undefined reference to `__cxa_end_cleanup'
Run Code Online (Sandbox Code Playgroud)
这是因为我无法访问正确的STL.
据我所知,只有三个,我可以从(选择stlport_static
,stlport_shared
,system
)通过设置APP_STL := stlport_static
在Application.mk
.
NDK还有另一个库可用吗?
我有一个比我想要的容器更小的图像.我希望图像能够拉伸,保持其纵横比,使其达到最大可能尺寸.
为了说明这个问题:
<ImageView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/thumbnail"
android:scaleType="fitXY"
android:adjustViewBounds="true"/>
Run Code Online (Sandbox Code Playgroud)
在ImageView
上述将被拉伸以填充所述容器的宽度.的@drawable
含有还沿x轴拉伸它,以适应宽度的ImageView
这是完美的.然而问题是标记的尺寸wrap_content
(在这种情况下是高度)保持与@drawable
s初始高度相同的尺寸.
我在这里阅读了有关ScaleType的文档,但在那里找不到答案.
下图描述了上面的代码:
Current behaviour Desired Behaviour
Run Code Online (Sandbox Code Playgroud)
编辑
一个ImageView
GIVEN scaleType="fitCenter"
将准确地扩大/收缩@drawable
在它的内部,同时保持它的高宽比生长尽可能大.
在ImageView
之前的S尺寸被定义@drawable
为以任何方式进行缩放.在ImageView
中它包含尺寸标注不结垢影响@drawable
.
windowIsFloating
虽然一个伟大的一站式商店创建Dialog
风格的UI有许多---错误---怪癖.
我现在正在努力的是它将顶部祖先的宽度/高度指定为"wrap_content
"而不是屏幕的宽度/高度.这意味着使用的常用UI设计"match_parents"
将向上传播成为"wrap_content"
.糟糕的时间.
所以,我真正想要的是创建一个活动,并有一个像这样的布局:
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/containerPageConatiner"
android:background="@drawable/windowBackground">
<View android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<FrameLayout android:id="@+id/singlePane"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_gravity="center_horizontal|center_vertical"
android:padding="10dp"/>
<View android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这会生成一个UI,显示调用它的Activity上的单个窗口(@ id/singlePane).
有没有人拥有创建透明背景活动所需的恰当样式?
我正在尝试插入和更新现有联系人的一条信息,因此我创建了一个示例应用程序以开发功能.我希望我的示例应用程序执行的操作是插入(或者如果存在)更新联系人的电子邮件地址.
我正在通过系统Intent选择一个联系人,如下所示:
startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST);
Run Code Online (Sandbox Code Playgroud)
返回的URI是Contact
(RawContact
?)的URI,它被选中并以这种形式出现:
content://com.android.contacts/contacts/lookup/0r2-2A90214945/2
.
我可以通过执行以下代码来撤回所有Data
(RawContact
?)项目:
Cursor cursor = contentResolver.query(mContactUri, null, null, null, null);
try {
if (cursor.moveToFirst()) {
for(int i=0; i < cursor.getColumnCount(); i++) {
String message = cursor.getColumnName(i);
Log.v("", message);
}
}
} finally {
cursor.close();
}
Run Code Online (Sandbox Code Playgroud)
从这里我应该能够确定联系人是否已经有一个CommonDataTypes.Email Data
成员:
cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1;
Run Code Online (Sandbox Code Playgroud)
然后执行以下的任一个Insert
或Update
所述数据:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(mContactUri)
.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
.withValue(Email.DISPLAY_NAME, "somebody@android.com")
.withValue(Email.TYPE, Email.TYPE_HOME)
.build()); …
Run Code Online (Sandbox Code Playgroud) 创建自己的SoftKeyboard时,默认情况下会给出"键预览".
你怎么禁用这个?
编辑:
您可以keyPreview
通过更改<KeyboardView>
属性来自定义布局android:keyPreviewLayout
.默认情况下,它会设置为查看keyboard_key_preview.xml:
编辑2: 跟随我成为红鲱鱼:
源代码建议提供0或不应用标记android:keyPreviewLayout
将导致没有出现键预览:
...
case com.android.internal.R.styleable.KeyboardView_keyPreviewLayout:
previewLayout = a.getResourceId(attr, 0);
break;
...
if (previewLayout != 0) {
mPreviewText = (TextView) inflate.inflate(previewLayout, null);
mPreviewTextSizeLarge = (int) mPreviewText.getTextSize();
mPreviewPopup.setContentView(mPreviewText);
mPreviewPopup.setBackgroundDrawable(null);
} else {
mShowPreview = false;
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
keyPreviewLayout
一个id为0的id引用(导致通胀崩溃).难住了.:( 任何帮助将不胜感激!
我有一个Library
项目设置和一个依赖于这个库项目的项目 - Everything编译得很好,但我的Dependent
项目运行正常;
我在使用Library
项目中的Activity时遇到了间歇性问题.
我的Library
项目可以作为库项目"取消选中","选择器"活动可以单独运行.Library
在它自己的权利运行项目工作正常没有问题.
当我使用Library
依赖项目中的项目(和"选择器"活动)时,它给了我NullPointerExceptions
(或历史上DexOp)错误,说"picker"Activity无法找到它的资源.
任何人都可以告诉我他们之前是否经历过这种情况吗?
编辑
手动将项目活动layout.xml
使用的Library
项目活动复制到依赖项目使项目正确打开"选择器"活动.这需要吗?!当然不是吗?这进一步让我想知道R.java
在Library
项目中合并/引用整数id是否存在问题.
编辑
我不确定这是否有任何后果,但我的一个Library
项目是围绕在不同前端项目中使用的一组自定义视图的包装器.
这些自定义视图都有一个Activity,因此可以单独测试它们.
其中一个视图具有自定义属性,这些属性在隔离运行时非常有效.但是,似乎依赖项目没有正确地拉入属性并将它们保留在原始命名空间中,导致导入的布局抛出编译错误:
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'listId' in package 'com.company.library.glowlist'
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'type' in package 'com.company.library.glowlist
Run Code Online (Sandbox Code Playgroud)
编辑
通过删除Dependent
项目中存在的重复文件名来解决DexOp错误.不确定文件名是问题还是文件内容.
编辑
到目前为止,我一直无法找到这个问题的解决方案(尽管@ yorkw的答案肯定有助于xml属性!谢谢).
我设法让这个问题断断续续:
我已经通过每个库项目中去,并确保他们都有自己的命名空间(即com.company.library.component1
, …
android ×10
android-ndk ×1
bundle ×1
custom-view ×1
drawerlayout ×1
imageview ×1
view ×1
wrapper ×1