简体   繁体   English

在onCreate()方法之外,getActionBar()为null

[英]getActionBar() is null outside the onCreate() method

Situation: I am making a chat app with Skype like UI. 情况:我正在使用Skype开发类似于UI的聊天应用程序。 The contacts recycler view is on the left side. 联系人回收者视图在左侧。 I have the custom ActionBar based theme. 我有基于自定义ActionBar的主题。

I need to set the title in the ActionBar onClick. 我需要在ActionBar onClick中设置标题。

So, basically, the onClick method is in the Adapter. 因此,基本上,onClick方法位于适配器中。 OnClick of the contacts, the method is passed to the Activity with ActionBar and the name of the contact should come in the title. 联系人的OnClick,该方法将通过ActionBar传递给Activity,并且联系人的名称应位于标题中。

The getActionBar() runs perfectly and the Title is set in onCreate method. getActionBar()可以完美运行,并且Title是在onCreate方法中设置的。 But, app crashes when I do the same in method outside onCreate. 但是,当我在onCreate之外的方法中执行相同操作时,应用程序崩溃。 I referred links here and here but I couldn't solve my issue. 在这里这里都引用了链接,但无法解决我的问题。

Please guide me regarding the same. 请同样指导我。

Example: 例:

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 is called, webservice returns the data which is set in the Adapter. 调用异步任务后,Web服务将返回在适配器中设置的数据。

Now, in 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.
        }
    });
}

Stack Trace 堆栈跟踪

E/ACRA: ACRA caught a NullPointerException exception for com.chat Building report. E / ACRA:ACRA捕获了com.chat生成报告的NullPointerException异常。 11-20 15:51:23.278 12797-12941/? 11-20 15:51:23.278 12797-12941 /? E/ACRA: com.chat fatal error : Attempt to invoke virtual method 'android.view.View android.view.Window.getDecorView()' on a null object reference java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.getDecorView()' on a null object reference at android.app.Activity.initWindowDecorActionBar(Activity.java:2397) at android.app.Activity.getActionBar(Activity.java:2339) at com.chat.activities.ChatActivity.onContactChange(ChatActivity.java:276) at com.chat.utilities.adapters.ChatCustomAdapter$1.onClick(ChatCustomAdapter.java:74) at android.view.View.performClick(View.java:5678) at android.view.View$PerformClick.run(View.java:22667) at android.os.Handler.handleCallback(Handler.java:836) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:203) at android.app.ActivityThread.main(ActivityThread.java:6293) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArg E / ACRA:com.chat致命错误:尝试在null对象引用java.lang.NullPointerException上调用虚拟方法'android.view.View android.view.Window.getDecorView()':尝试调用虚拟方法'android。 com上android.app.Activity.getActionBar(Activity.java:2339)上android.app.Activity.initWindowDecorActionBar(Activity.java:2397)上的空对象引用上的view.View android.view.Window.getDecorView()' .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.os.Handler.dispatchMessage(Handler.java:103)在android.os.Handler.handleCallback(Handler.java:836)在android.view.View $ PerformClick.run(View.java:22667) android.app.ActivityThread.main(ActivityThread.java:6293)处的os.Looper.loop(Looper.java:203)com.android.internal.os处的java.lang.reflect.Method.invoke(Native Method)处的os.Looper.loop(Looper.java:203)。 ZygoteInit $ MethodAndArg sCaller.run(ZygoteInit.java:1065) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:926) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:926)上的sCaller.run(ZygoteInit.java:1065)

Please guide me to solve the solution for the same. 请指导我解决相同的问题。

My suggestion is to use setSupportActionBar() for whole activity. 我的建议是将setSupportActionBar()用于整个活动。 Here in your layout. 在您的布局中。

 <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);
}

Then you will be able to use it by calling getSupportActionBar() anywhere in your activity such as: 然后,您可以通过在活动中的任何地方调用getSupportActionBar()来使用它,例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM