gpt4 book ai didi

java - 如何将对话框 fragment 值从对话框返回到主 Activity ?

转载 作者:行者123 更新时间:2023-12-02 05:31:38 25 4
gpt4 key购买 nike

编辑:我意识到我正在以错误的心态思考它,我需要“返回”在对话框中输入的值。标题已更新以反射(reflect)这一点。对话框 fragment 是从 onNavigationItemSelected 调用的。如何将这些值从对话框“返回”到主 Activity 以供使用?我无法从 onclicklistener 中的对话框调用 mainactivity 方法,它说“不能从静态上下文引用非静态方法”。

<小时/>

我的 MainActivity 中有一个 webview,我的应用程序基于该 webview,其他所有内容都是 fragment 或对话框。我需要能够引用这个 webview,这样我就可以根据用户在对话框中输入的内容来用它做一些事情。

我有一个用于与 webview 交互的 JavaScriptInterface 类,我也遇到了同样的问题,但通过将其扩展到 MainActivity 来对其进行排序(我不知道这是否是最好的方法,可能不是)。

在对话框和其他类中我不能这样做,因为它需要扩展其他东西,即对话框等。那么我如何从这些类中获取对它的引用呢?

主要 Activity :

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {

Context context;

public WebView webView;
JSInterface JSInterface;

// other stuff

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

context = getApplicationContext();

webView = findViewById(R.id.webView);
JSInterface = new JSInterface(this, this);

}

@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();

//creating fragment object
Fragment fragment = null;

//initializing the fragment object which is selected
if (id == R.id.nav_home) {

} else if (id == R.id.nav_go_to) {
FragmentManager fm = getSupportFragmentManager();
DialogFragmentGoTo dialogFragment = new MyDialogFragment();
dialogFragment.show(fm, "MyDialogFragment");
}

//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_main, fragment);
ft.addToBackStack(null);
ft.commit();
}

DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}

JS接口(interface):

public class JSInterface extends MainActivity {

private MainActivity mainActivity;
JSInterface(Context context, MainActivity mActivity) {
mainActivity = mActivity;
}

@JavascriptInterface
public void someMethod() {
//can interact with webview from here if needed, as if from mainactivity
}

// other methods

}

对话框 fragment :

public class DialogFragmentGoTo extends DialogFragment {

Context context;
EditText et1;
EditText et2;
LinearLayout layout;
AlertDialog.Builder builder;

String et1Text;
String et2Text;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

//init
context = getContext();

et1 = new EditText(context);
et2 = new EditText(context);

layout = new LinearLayout(context);
builder = new AlertDialog.Builder(getActivity());

//layout options
layout.setOrientation(LinearLayout.VERTICAL);

setDialog();

builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
et1Text = et1.getText().toString();
et1Text = et2.getText().toString();
setInputs(et1Text, et2Text);
}
});

builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();

}
});

return builder.create();
}

private void setInputs(String et1Text, String et2Text) {
webView.loadUrl("javascript:setInputs(" + et1Text + "," + et2Text + ");");
}

private void setDialog() {
//et1
et1.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
et1.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
et1.setSingleLine(true);
et1.setLines(1);
et1.setMaxLines(1);
et1.setHorizontalScrollBarEnabled(false);
et1.setHint("Text1");
layout.addView(et1);

//et2
et2.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
et2.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
et2.setSingleLine(true);
et2.setLines(1);
et2.setMaxLines(1);
et2.setHorizontalScrollBarEnabled(false);
et2.setHint("Text2");
layout.addView(et2);

//builder
builder.setTitle("Enter texts");
builder.setView(layout);
}
}

现在,如果我将其设为静态,我可以导入它,但这不是一个选项,而且对于 webview 来说这是不好的做法(内存泄漏):

import static com.example.app.MainActivity.webView;

我是编程初学者,因此如果有人可以帮助我并解释我如何做到这一点 - 我将非常感激。

最佳答案

从其他 Activity/fragment 获取东西? startActivityForResult更一般地说,您应该查看 MVVM 并创建一个包含您需要的所有信息的 ViewModel。然后您可以使用 WebView 对 Activity 中的信息(也许是 LiveData Observer?)使用react。

关于java - 如何将对话框 fragment 值从对话框返回到主 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com