编辑:我意识到我在用错误的思维方式进行思考,我需要“返回”对话框中输入的值。标题已更新以反映这一点。 对话框片段是从onNavigationItemSelected调用的。 如何将这些值从对话框“返回”到要使用的主要活动中?我无法从onclicklistener对话框中调用mainactivity方法,它说“无法从静态上下文中引用非静态方法”。
我的MainActivity中有一个Web视图,该视图基于我的应用程序,其他所有内容都是片段或对话框。 我需要能够引用该Webview,以便可以根据用户在对话框中输入的内容对其进行处理。
我有一个JavaScriptInterface类,用于与我遇到相同问题的webview进行交互,但是通过将其扩展到MainActivity进行了排序(这是否是我所不知道的最好的方法,也许不是)。
在对话框和其他类中,我无法执行此操作,因为它需要扩展其他内容,例如Dialog等。 那么如何从这些类中引用它呢?
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;
}
}
JSInterface:
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
}
DialogFragment:
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;
我是编程的初学者,所以如果有人可以帮助我并解释我的操作方法,我将非常感谢。
答案 0 :(得分:0)
是否从其他活动/片段中获取东西? startActivityForResult
通常,您应该看一下MVVM并创建一个ViewModel来保存所需的所有信息。
然后,您可以使用WebView对Activity中的该Infomation(也许是LiveData Observer?)做出反应。
答案 1 :(得分:0)
按照此处的说明创建对话框界面的说明: