无法启动活动(java.lang.IllegalStateException:已经附加)

时间:2017-03-17 08:04:23

标签: java android

我正在尝试使用主屏幕上的五个按钮构建一个应用程序。按下每个按钮时会弹出一个新活动。

当我按下第二个按钮时,显示错误:

**java.lang.RuntimeException: Unable to start activity ComponentInfo{debuggers.os_project/debuggers.os_project.SJF}: java.lang.IllegalStateException: Already attached**

第一个按钮工作正常。直到我只编码了两个按钮。

我的main_activity.java是:

package debuggers.os_project;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private static Button fcfs;
private static Button sjf;

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

    fcfs = (Button)findViewById(R.id.fcfs);
    sjf = (Button) findViewById(R.id.sjf);
    fcfs.setOnClickListener(
            new Button.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(v.getContext(), FCFS.class);
                    startActivity(intent);
                }
            }
    );
}

public void onSJF(View view){
    Intent intent = new Intent(view.getContext(),SJF.class);
    startActivity(intent);
}
}

3 个答案:

答案 0 :(得分:0)

下面:

for k in some_dict:
  # k is a string
  # some_dict[k] return the value of k in the dict

要开始一个新活动,您将当前活动类作为第一个参数传递,将下一个活动类作为Intent新实例的第二个参数传递!

请尝试看看是否有效;

答案 1 :(得分:0)

点击监听器上的

应如下所示:

fcfs = (Button)findViewById(R.id.fcfs);
fcfs.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         Intent intent = new Intent(MainActivity.this, FCFS.class);
         startActivity(intent);
});

你没有使用你的方法。 您可以构建一个方法,并且可以通过所有按钮使用:

public void method_for_intent (Class your_class){
    Intent intent = new Intent(MainActivity.this, your_class);
    startActivity(intent);
}

在你的onCreate中,最终应该是这样的:

Button fcfs = (Button)findViewById(R.id.fcfs);
Button sjf = (Button) findViewById(R.id.sjf);
fcfs.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         method_for_intent(FCFS.class)
    });
sjf.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         method_for_intent(SJF.class)
    });

您可以在新活动中多次致电oncreateIllegalStateException (Already attached) when opening NFC reader app

(您也可以将点击监听器放入方法中) 避免测试代码。 如果我有什么不妥,请高高在上。

答案 2 :(得分:0)

super.onCreate()在您的“活动”中可能会被调用两次。检查您是否没有错误地这样做。

如果您深入研究Activity / FragmentActivity代码,则可以看到该错误与其与FragmentManager的关系有关:

您的活动通常将继承自FragmentActivity继承的AppCompatActivity:

// FragmentActivity
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    mFragments.attachHost(null /*parent*/);
    ...
}

// FragmentController
public void attachHost(Fragment parent) {
    mHost.mFragmentManager.attachController(mHost, mHost /*container*/, parent);
}

// FragmentManager
public void attachController(FragmentHostCallback host, FragmentContainer container, Fragment parent) {
    if (mHost != null) throw new IllegalStateException("Already attached");
    mHost = host;
    mContainer = container;
    mParent = parent;
}

BOOM!