【问题标题】:Call mainActivity's method in LifecycleObserver在 LifecycleObserver 中调用 mainActivity 的方法
【发布时间】:2018-12-19 18:19:31
【问题描述】:

我有麻烦了。

我想从 LifeCycleManager(它是 LifecycleObserver)调用 MainActivity 的方法并执行简单的 XML 修改。但是那次崩溃是因为我试图访问一个 XML 值并且 main_activity.xml 还没有完全创建

首先这是我的 LifeCycleManager:

class LifeCycleManager(context: Context) : LifecycleObserver {

companion object {
    var notif = NotificationManager()
    var onForeground = false
    var main = MainActivity()

    // If we are on MainActivity return true , otherwise return false
    fun isOnHomeController(context: Context?): Boolean {

        if (context == null || context !is MainActivity)
            return false

        return true
    }


var mContext = context

// WHEN THE APP BECOME ACTIVE
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun appComeBackFromBackground() {
    onForeground = true
    notif.cancelAllLocalNotifications(mContext)

    if (isOnHomeController(mContext)) {
        // Call the refresh dialog and print it
        main.appComeBackFromBackground("refresh", null)
    }
}
}

这是我的 MainActivity 方法:

fun appComeBackFromBackground(status: String?, elementsadded: Int?)
{
Log.e("enterForeground", "App come back in Foreground")
if (status == null) return

when (status)
{
    "refresh" ->{
        val text = findViewById<TextView>(R.id.refreshtext)
        text.setText("test")
    }
    else -> {
        return
    }

}
}

正如您所见,当我的 MainActivity Start 时,我的 Lifecycle 获取事件并直接进入我的 appComeBackFromBackground() 方法。 在其中我调用我的 MainActivity 方法,我想从 activity_main.xml 修改一个元素

论文崩溃:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.mControllers.MainActivity}:java.lang.RuntimeException:调用观察者方法失败

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

请问我该怎么办?我真的需要这样做( LifecycleObserver 到 MainActivity )。谢谢

编辑:

我尝试像这样延迟调用 MainActivity 的方法:

Handler().postDelayed({
        main.appComeBackFromBackground("refresh", null)
    }, 5000)

即使加载了 MainActivity 布局,它也会崩溃

【问题讨论】:

  • 您正在尝试设置尚未创建的视图的文本。在生命周期方法中保存您想要在共享首选项中设置的值,然后在活动中更新视图。
  • @MRah 正是视图尚未创建。问题是我不想保存任何特定数据,我只想在我的 LifecycleObserver 告诉我我在前台时执行一些 XML 更改
  • 要永久修改xml布局吗?你能更详细地解释一下你的情况吗?对我来说,你想控制你的应用是来自后台还是从头开始创建的,对吗?不过,在这里完全修改布局没有任何意义!
  • @MRah 对不起,如果不够清楚,它有点复杂。我想访问 xml 布局。例如:我的 XML 中有一个元素对“不可见”具有可见性,我希望在 MainActivity 的方法中找到该元素并将其设置为“可见”,以便在我的屏幕上显示它m 在我的 MainActivity
  • @MRah okey 我会像你说的那样做,我会优先保存值“刷新”,例如当布局完全加载时在我的 MainActivity 中解释它

标签: java android xml android-layout kotlin


【解决方案1】:

我正在用 Java 写这个, (如果您不想将数据保存在首选项或存储中,这是该方法)

应用类:

public class TestApplication extends Application implements ActivityLifecycleCallbacks {
    private static String mStringToSet;
    
    @Override
    public void onCreate() {
        super.onCreate();
        //App is not from background, a new instance of your app           is created 
        mStringToSet="new_instance";
        registerActivityLifecycleCallbacks(this);
    }

    public static String getStringToSet() {
        return mStringToSet;
    }

  
    @Override
    public void onActivityDestroyed(Activity activity) {
        if(activity instanceof MainActivity){
        //This is only called when the activity is destroyed not the application, so if the context is your desired activity then set the string here
            mStringToSet="refresh";
        }
    }

   //Implement other life cycle methods** 

  

在您的活动中:

public class MainActivity extends AppCompatActivity {
    private final String TAG="ACTIVITY";

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


        if("refresh".equals(TestApplication.getStringToSet())){
            Toast.makeText(this,"From Background",Toast.LENGTH_SHORT).show();
            (TextView)findViewById(R.id.YOUR_TEXT_VIEW).setText("refresh")
        }else{
            Log.d(TAG,TestApplication.getStringToSet());
            Toast.makeText(this,"Not from background",Toast.LENGTH_SHORT).show();
           (TextView)findViewById(R.id.YOUR_TEXT_VIEW).setText("new_instance")
        }

    }
}
     //Implement other life cycle methods
}
      

【讨论】:

  • 我很清楚。看起来不错,我会详细看看这个,我会选择你的两个答案之一。谢谢大佬
猜你喜欢
  • 2019-05-22
  • 2016-08-12
  • 2017-09-22
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多