2

最後に、私は問題が何であるかを発見しました...

次のような関数がある場合:

public void test()
{
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager(), "login");
}

このダイアログは、test() が終了したときにのみ表示されます。これが Android ダイアログが機能する唯一の方法かどうかはわかりませんが、これについて詳しく読むことは間違いありません...


元の質問:

私はAndroidの世界が初めてです。誰かが光を当てることができますか?

dlg.show() は例外なく実行されましたが、何も起こりません。何が問題なのかを知るにはどうすればよいですか? プロジェクトは Android 2.2 の API を使用しています。

public class MainActivity extends FragmentActivity
{
    ...
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager(), "login");
}

ダイアログのレイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<EditText
    android:id="@+id/username"
    android:inputType="textEmailAddress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"
    android:hint="username" />
<EditText
    android:id="@+id/password"
    android:inputType="textPassword"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="16dp"
    android:hint="password"/>
</LinearLayout>

ダイアログクラス:

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;

public class LoginDialog extends DialogFragment
{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(inflater.inflate(R.layout.login_dialog, null))
        // Add action buttons
               .setPositiveButton("Sign In", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // sign in the user ...
                   }
               })
               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        // do something
                   }
               });
        return builder.create();
    }
}
4

6 に答える 6

3

newInstance() を使用してフラグメントを作成してみてください

public class LoginDialog extends DialogFragment
{
    static LoginDialog newInstance(String title) {
        LoginDialog f = new LoginDialog();
        Bundle args = new Bundle();
        args.putString("title", title);
        f.setArguments(args);
        return f;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        .
        .
        .
    }
}

そして、あなたの MainActivity で

public class MainActivity extends Activity // notice that in my case I extend Activity instead of FragmentActivity
{
    @Override
    public void onCreate(Bundle savedInsatnceState) {
        super.onCreate(savedInsatnceState);
        setContentView(R.layout.main);
        LoginDialog dialogFragment = LoginDialog.newInstance("My Dialog");
        dialogFragment.show(getSupportFragmentManager(), "login");
    }
}
于 2012-11-11T15:47:45.440 に答える
1

代わりにfragmenttransactionを使用した場合:

public class MainActivity extends FragmentActivity
{
    ...
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager().beginTransaction(), "login");
}

編集:

DialogFragmentsの Google ガイドをご覧になることをお勧めします。alertbuilder のカスタム ビューで行っていることが、表示されない原因になっている可能性があります。

于 2012-11-11T13:13:13.240 に答える
0

残念ながら、質問の上部に問題の原因に関する情報を追加しました。

編集(@MarcinSのコメント用):

public void test()
{
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager(), "login");
    doThis();
    doThat();
}

ダイアログはdlg.show()の直後には表示されず、doThat()が終了した後に表示されます。

于 2012-11-12T03:12:51.223 に答える
0

onResumeの後にダイアログが表示されないという同じ問題がありました。(ゲームを一時停止したことをユーザーに通知し、続行するかどうかを尋ねるダイアログがありました)。私は単にそれを早い段階で呼び出しましたが、その理由は、onPostResume() で、dialog.show() の後にロードしたフラグメントだったと思います。dialog.show がキューにあるかどうかを検出することで解決し、フラグメントがロードされた後、onPostResume まで表示されるのを待ちました。

これは、ダイアログを表示するための関数です:

@Override public void onShowUserDialog(String title, String message, int type) { FragmentTransaction fm = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager(). findFragmentByTag(PublicVar.DIALOG_USER); if (prev != null) { fm.remove(prev); fm.commit(); } if (hasPostResumed) { DialogFragment userDialog = UserDialog. newInstance(title, message, type); userDialog.show(getSupportFragmentManager().beginTransaction(), PublicVar.DIALOG_USER); dialogTitle = ""; dialogMessage = ""; dialogType = 0; } else { //saved for later dialogTitle = title; dialogMessage = message; dialogType = type; } }

hasPostResumed、dialogTitle、dialogMessage、および dialogType がアクティビティで宣言されています。

これは、アクティビティが再開されたときの最後の呼び出しです。

protected void onPostResume() {
    super.onPostResume();
    hasPostResumed = true;

    ...function for loading my fragments...

    if (dialogType != 0) {
        onShowUserDialog(dialogTitle, dialogMessage, dialogType);
    }
}
于 2014-05-29T07:09:04.433 に答える