【问题标题】:getActionBar() is null outside the onCreate() methodgetActionBar() 在 onCreate() 方法之外为 null
【发布时间】:2017-11-20 10:25:38
【问题描述】:

情况: 我正在使用类似 UI 的 Skype 制作聊天应用程序。联系人回收站视图位于左侧。 我有基于自定义 ActionBar 的主题。

我需要在 ActionBar onClick 中设置标题。

所以,基本上,onClick 方法在适配器中。联系人的OnClick,该方法通过ActionBar传递给Activity,并且联系人的名字应该在标题中。

getActionBar() 运行完美,并且在 onCreate 方法中设置了 Title。但是,当我在 onCreate 之外的方法中执行相同操作时,应用程序会崩溃。 我引用了链接herehere,但我无法解决我的问题。

请指导我。

示例:

ChatActivity extends Activity {

    //..onCreate here

    if(getActionBar() != null) {
        String title = " Chat: ";

        if(userName != null) {
            title = title + userName;
        }

        getActionBar().setTitle(title);
    }

    // onCreate finishes

    // onContactChange    
    public void onContactChange(int position, ContactsVO addContact) {            
        userName = addContact.getName().toString();
        String url = addContact.getDP();

        if(getActionBar() != null) {     //App crashes here
            String title =" Chat: ";

            if(userName != null)
                title = title + userTo;

            getActionBar().setTitle(title);
        }
    }
}

Async Task被调用,webservice返回Adapter中设置的数据。

现在, 在适配器中,

ChatActivity c1 = new ChatActivity();

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    ContactsVO contactsvo = data.get(position);

    holder.tv.setText(contactsvo.getName());
    String url = contactsvo.getDP();

    Glide.with(getContext())
            .load(url)
            .crossFade()
            .into(holder.img);


    holder.row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            c1.onContactChange(position,contactsvo);    //method called here.
        }
    });
}

堆栈跟踪

E/ACRA:ACRA 捕获 com.chat 的 NullPointerException 异常 建设报告。 11-20 15:51:23.278 12797-12941/? E/ACRA: com.chat 致命错误:尝试调用虚拟方法'android.view.View android.view.Window.getDecorView()' 在空对象引用上 java.lang.NullPointerException:尝试调用虚拟方法 'android.view.View android.view.Window.getDecorView()' 为空 对象引用 在 android.app.Activity.initWindowDecorActionBar(Activity.java:2397) 在 android.app.Activity.getActionBar(Activity.java:2339) 在 com.chat.activities.ChatActivity.onContactChange(ChatActivity.java:276) 在 com.chat.utilities.adapters.ChatCustomAdapter$1.onClick(ChatCustomAdapter.java:74) 在 android.view.View.performClick(View.java:5678) 在 android.view.View$PerformClick.run(View.java:22667) 在 android.os.Handler.handleCallback(Handler.java:836) 在 android.os.Handler.dispatchMessage(Handler.java:103) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6293) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1065) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:926)

请指导我解决同样的问题。

【问题讨论】:

  • 你需要先设置setSupportActionbar(toobar)
  • onCreate 之外在哪里?如果它在生命周期中 onCreate 之前调用的任何方法中,则视图尚未创建,您无法加载操作栏
  • setcontentview 之后的 onCretae
  • @Shachi 也许如果您添加了请求的信息,这不会是重复的。当您没有足够的信息并且只有一点点代码和 NPE 堆栈跟踪时,这会导致重复。添加更多代码,添加崩溃发生时的实际代码,而不是说“当我将它放在方法中时它不起作用”。 什么方法?? 怎么调用的?由于顺序和线程,时间和方式很重要。

标签: java android android-actionbar


【解决方案1】:

我的建议是对整个活动使用 setSupportActionBar()。 在您的布局中。

 <android.support.v7.widget.Toolbar
        android:id="@+id/home_activity_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways" />


//OnCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);

    toolbar = (Toolbar) findViewById(R.id.home_activity_toolbar);
    configureHomeToolBar();
}


private void configureHomeToolBar() {

    toolbar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary));
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setIcon(R.drawable.my_logo);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}

然后您就可以通过在活动中的任何位置调用getSupportActionBar() 来使用它,例如:

getSupportActionBar().setDisplayUseLogoEnabled(false);
getSupportActionBar().setTitle(titlesArray[someIndex]);

【讨论】:

  • 为此您必须扩展 AppCompatActivity 而不是 Activity,对吧?
  • "尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'" 这给出了上述错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2011-08-14
  • 2013-04-16
  • 2015-06-07
相关资源
最近更新 更多