java - 如何将对话框片段值从对话框返回到主要活动?
问题描述
编辑:我意识到我正在以错误的心态思考它,我需要“返回”在对话框中输入的值。标题已更新以反映这一点。从 onNavigationItemSelected 调用对话框片段。如何将这些值从对话框“返回”到要使用的主要活动?我无法从 onclicklistener 的对话框中调用 mainactivity 方法,它显示“无法从静态上下文引用非静态方法”。
我的 MainActivity 中有一个 webview,我的应用程序基于它,其他一切都是片段或对话框。我需要能够获得对这个 webview 的引用,以便我可以根据用户在对话框中输入的内容来使用它。
我有一个 JavaScriptInterface 类,用于与我遇到相同问题的 webview 交互,但通过将其扩展到 MainActivity 对其进行排序(这是否是我不知道的最佳方法,可能不是)。
在对话框和其他类中我不能这样做,因为它需要扩展其他东西,即对话框等。那么我怎样才能从这些类中获得对它的引用呢?
主要活动:
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接口:
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
}
对话片段:
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);
}
}
现在,如果我将其设为静态,我可以导入它,但这不是 webviews 的选项和不好的做法(内存泄漏):
import static com.example.app.MainActivity.webView;
我是编程初学者,所以如果有人可以帮助我并解释我是如何做到这一点的 - 我将非常感激。
解决方案
按照此处为对话框创建界面的说明进行操作:
推荐阅读
- css - 如何让 CSS Vars 在所有浏览器中工作
- c - C strcat将垃圾插入字符串
- python - Python Regex 中可能存在的错误......或者我错过了一些东西 - 无法匹配
- c# - С# NPOI 词表记数
- amazon-web-services - AWS Amplify:部署的代码/构建或全局内容在哪里
- java - 通过将 Oracle 过程定义为 Oracle 过程来运行 Java 过程
- windows - Windows 上的 Kotlin - 使用 try/catch 块未捕获错误
- ruby-on-rails - total_pages 错误 will_paginate 错误,旧版应用程序
- html - CSS Center 在最小宽度下裁剪图像
- android - 如何实现一个安全的系统BroadcastReceiver