【问题标题】:Toast and startActivity work in fragment but not classToast 和 startActivity 在片段中工作,但不在类中
【发布时间】:2026-01-11 20:30:01
【问题描述】:

我无法让 Toast 和 startActivity 在 VLC.java 类中工作。如果将它们放在 TerminalFragment.java 类中,这两个语句都可以工作。

Android Studio 报告没有问题,但是当我运行应用程序时它崩溃了。

我已经尝试了所有可能的 getActivity、startActivity 和 Context 排列,但没有任何效果。我怎样才能让它工作?

TerminalFragment.java

receiveText.append(toCaretString(msg, newline.length() != 0));            
        Task(msg);
        // If I put the Intent and startActivity(play) here it works fine
    }
}

public void Task(String tsk) {
//  String id = tsk.substring(0, 2);
    String id = "01";
    String[] smallString = StringUtils.substringsBetween(tsk, ";", ";");

    switch (id)
    {
    // VLC
    case "01":
       VLC myObj = new VLC();
        myObj.RadioStream(smallString);
        break;
    case "02":
        Toast.makeText(getActivity(), id, Toast.LENGTH_SHORT).show();
        break;
    default:
       Toast.makeText(getActivity(), "default", Toast.LENGTH_SHORT).show();
        break;
    }
}

VLC.java

package com.android_usb_gateway;

import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;

public class VLC extends MainActivity {

public void RadioStream(String[] args) {

    // Can not get the Toast to work
    Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();

    // Get the name and url
    String url = args[2];
    String name = args[3];
    String AUDIO_WILD = args[4];
    String TITLE = args[5];

    // The intent and startActivity(play) work fine if they are in   TerminalFrament.java
    Intent play = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.parse(url);
    play.setPackage(MainActivity.app);
    play.setDataAndType(uri, AUDIO_WILD);
    play.putExtra(TITLE, name);

    // Can not get this to work
    startActivity(play);
  }
}

【问题讨论】:

  • 我认为这是因为您的 vlc 活动中没有 onCreate() 方法。
  • 不幸的是,调试应用程序的唯一方法是通过 Toast 消息。该应用程序是一个USB网关,连接到我的Arduino,不能同时连接到我的PC。

标签: java android class fragment toast


【解决方案1】:

我设法让它工作如下:

TerminalFragment.java

VlcObject obj = new VlcObject(this);
obj.RadioStream(smallString);

VlcObject.java

public class VlcObject {
    TerminalFragment c;

    public VlcObject(TerminalFragment c) {
        this.c = c;
    }

    public void RadioStream(String[] args) {

    Intent play = new Intent(Intent.ACTION_VIEW);

    c.startActivity(play);
    }
}

【讨论】:

    【解决方案2】:

    我刚刚测试了上面的 VLC 类和 RadioStream 方法中的 Toast 工作

    我认为问题与您在 onCreate 中调用方法的方式有关。

    确保你没有这样做

    new VLC().RadioStream()
    

    因为新的 VLC 对象将没有附加上下文,并且您将通过调用 getApplicationContext()

    获得空点指针异常

    【讨论】:

    • 我是Android新手,但据我了解,App中只有一个onCreate。我在 MainActivity 中有如下内容:
    • @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);工具栏工具栏 = findViewById(R.id.toolbar); setSupportActionBar(工具栏); getSupportFragmentManager().addOnBackStackChangedListener(this); if (savedInstanceState == null) getSupportFragmentManager().beginTransaction().add(R.id.fragment, new DevicesFragment(), "devices").commit();否则 onBackStackChanged(); }
    • 你在哪里调用 RadioStream()?我认为您的问题声称 Toast 仅适用于 Fragment 而不适用于 VLC 活动类。 Toast 不起作用的活动中的哪些位置
    • RadioStream() 在 TerminalFragment 的 switch 语句 01 中被调用。如果我在 switch 语句中的调用之前移动 Toast,那么 Toast 工作正常。如果我用 VLC.java 中的意图和 startactivity() 替换 TerminalFragment 中的 task(msg) 调用,它也可以正常工作。
    • 让我们把它移到 chats,看来你的问题不是自我描述的。我愿意提供帮助 - 在这里加入 chat.*.com/rooms/234000/…
    最近更新 更多