Как передать URL-адрес MainActivity для BrowserActivity [duplicate]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

240
задан VansFannel 12 October 2010 в 11:19
поделиться

5 ответов

418
ответ дан David 23 August 2018 в 22:33
поделиться

Просто добавьте дополнительные данные в намерение, которое вы используете для вызова своей активности.

В активности вызывающего абонента:

Intent i = new Intent(this, TheNextActivity.class);
i.putExtra("id", id);
startActivity(i);

Внутри функции onCreate () вы вызываете:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");

Редактировать: К сожалению, Чарли Шин был быстрее.

107
ответ дан DavGin 23 August 2018 в 22:33
поделиться

Код Котлина:

Запустить SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

Получить идентификатор в SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

, где gameId - String? (может быть нулевым)

0
ответ дан Francis Novotný 23 August 2018 в 22:33
поделиться

Мне нравится делать это со статическим методом во втором действии:

private static final String EXTRA_GAME_ID = "your.package.gameId";

public static void start(Context context, String gameId) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra(EXTRA_GAME_ID, gameId);
    context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    ... 
    Intent intent = this.getIntent();
    String gameId = intent.getStringExtra(EXTRA_GAME_ID);
}

Затем из вашего первого действия (и для чего-либо еще) вы просто выполните:

SecondActivity.start(this, "the.game.id");
33
ответ дан marcusshep 23 August 2018 в 22:33
поделиться

Существующие ответы (передать данные в Intent, переданные в startActivity()), показывают нормальный способ решения этой проблемы. Существует еще одно решение, которое можно использовать в нечетном случае, когда вы создаете Activity, который будет запущен другим приложением (например, один из действий редактирования в плагине Tasker ) и, следовательно, не управляйте Intent, который запускает Activity.

Вы можете создать базовый класс Activity с конструктором с параметром, а затем производным классом, который имеет конструктор по умолчанию, который вызывает конструктор базового класса со значением, так:

class BaseActivity extends Activity
{
    public BaseActivity(String param)
    {
        // Do something with param
    }
}

class DerivedActivity extends BaseActivity
{
    public DerivedActivity()
    {
        super("parameter");
    }
}

Если вам нужно сгенерировать параметр для перехода к конструктору базового класса, просто замените строго кодированное значение вызовом функции, который возвращает правильное значение для передачи.

3
ответ дан Trebor Rude 23 August 2018 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: