gpt4 book ai didi

Android findViewById(android.R.id.home) 返回 null 与支持库

转载 作者:太空宇宙 更新时间:2023-11-03 10:19:13 25 4
gpt4 key购买 nike

我想更改 ActionBar 主页按钮的左内边距。我试过了 this解决方案。但是当我尝试 findViewById(android.R.id.home) 时,我得到了 null。同时 android.R.id.home 不为 0。只有当我使用 android-suppot-v7 时才会发生这种情况。如果我不使用支持库,一切都会好起来的。也许有人可以帮助我?

这是我的简单代码:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
ImageView view = (ImageView)findViewById(android.R.id.home);
if (view !=null){
view.setPadding(10, 0, 0, 0);
}
}
}

布局:

<RelativeLayout 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"
tools:context="com.example.timoshkois.actionbar.MainActivity">

</RelativeLayout>

最佳答案

嗯,你没看错,如果你查看你继承自的Activity的源代码,他们也使用android.R.id.home

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/appcompat/src/android/support/v7/app/ActionBarActivity.java

像这样

@Override
public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) {
if (super.onMenuItemSelected(featureId, item)) {
return true;
}
final ActionBar ab = getSupportActionBar();
if (item.getItemId() == android.R.id.home && ab != null &&
(ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
return onSupportNavigateUp();
}
return false;
}

查看 ActionBar 是如何创建的,它使用这些类:

https://github.com/android/platform_frameworks_support/blob/5476e7f4203acde2b2abbee4e9ffebeb94bcf040/v7/appcompat/src/android/support/v7/app/ActionBarActivityDelegateBase.java

https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/app/WindowDecorActionBar.java

这导致 ActionBar 类,这可能有关于为什么它返回 null 的线索

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ActionBar.java#L106

/**
* Standard navigation mode. Consists of either a logo or icon
* and title text with an optional subtitle. Clicking any of these elements
* will dispatch onOptionsItemSelected to the host Activity with
* a MenuItem with item ID android.R.id.home.
*
* @deprecated Action bar navigation modes are deprecated and not supported by inline
* toolbar action bars. Consider using other
* <a href="http://developer.android.com/design/patterns/navigation.html">common
* navigation patterns</a> instead.

这种弃用意味着新的工具栏将不会使用导航模式,所以可能这也意味着工具栏将没有这个 Android id (R.id.home ) - 这是有道理的,因为前面的链接表明 app compat 不使用 Toolbar ,旧版实现不会使用它。


作为测试,您可以按照评论中的说明进行操作并覆盖 onOptionsItemSelected 按 Logo 并查询传递给您的 View 以找到它的 ID getId()

关于Android findViewById(android.R.id.home) 返回 null 与支持库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com